习题四-参考答案
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
void main()
{ int primes[N]; int pc,m,k;
primes[0] = 2; /* 2 是第一质数 */
pc
= 1; /* 已有一个质数 */
m
= 3; /* 被测试的数从 3 开始 */
while (pc < N) { /* 调整 m 使它为下一个质数 */
k = 0;
int index[120], pc; int i, f, r; printf("Enter letter line.\n"); gets(buf); pc = f = r = 0; for(i=0; buf[i]!='\0'; i++)
if(buf[i]=='(') r++; else if (buf[i]==')'){
#include <iostream.h> #define N 100 int a[N]; int n, length, i, m; int main(){
cout << "输入数组 a[]的元素个数.\n"; cin >>n; cout<<"自小到大顺序输入数组 a[]的"<<n<<"个元素.\n"; for(i=0; i<n; i++)
cout << p3[i][1]; } else {
cout << "-"; if(p3[i][0]==0 || p3[i][1]!=-1 ) //x 之前的系数-1 中的 1 不输出
cout << -p3[i][1]; } if(p3[i][0] > 1)
cout << "x↑"<< p3[i][0]; else if(p3[i][0] == 1)
} (3)设数组为 a,有 N 个元素。 for(int i = 0, j = N-1; i < j; i++, j++){
int temp = a[i]; a[i] = a[j]; a[j] = temp; } 2. 输入一行字符,分别统计其中各英文字母出现的次数(不区分大小写)。 答: #include <stdio.h> int main() { char buf[120]; int i, count[26]; printf("Enter letter line.\n"); gets(buf); for(i=0; i<26; i++)
答:
#include <iostream.h> #include <math.h> #define N 100 double p1[N][2], p2[N][2], p3[N][2]; int n1, n2, i, j, k; double p, c; int main(){
cout << "输入多顶式 1,按幂次由高到低顺序(幂次-1 结束).\n"; for(n1 = i = 0; ; i++){
if(p1[i][0] > p2[j][0]){ p3[k][0] = p1[i][0]; p3[k++][1] = p1[i++][1];
}else if(p1[i][0] < p2[j][0]){ p3[k][0] = p2[j][0]; p3[k++][1] = p2[j++][1];
}else{ if(fabs(p1[i][1] + p2[j][1]) > 0.00001){ p3[k][0] = p2[j][0];
} for(j = 0; j < n; j++)
if(sieve[j]) cout << j << "\t";
cout << endl; return 0; } 8. 求前 n 个质数。要求确定数 m 是否是质数,用 m 被已求得的质数的整除性来确定。 答:
#include <stdio.h>
#define N 50
count[i]=0; for(i=0; buf[i]!='\0'; i++)
if(buf[i]>='A' && buf[i]<='Z') count[buf[i]-'A']++;
else if (buf[i]>='a' && buf[i]<='z') count[buf[i]-'a']++;
for(i=0; i<26; i++) if (count[i]) /* 未出现的字母不输出 */
primes[pc++] = m;
m += 2; /* 除 2 外, 其余质数均是奇数 */
}
/* 输出 primes[0] 至 primes[pc-1] */ for(k=0;k<pc;k++)
printf("%4d",primes[k]); printf("\n");
}
9.编制输入年份,输出该年年历的程序。 提示:已知日期,按以下公式计算该日期的 N 值: N=1461*f(年、月)/4+153*g(月)/5+日; 其中函数 f()和 g()的计算公式为: f(年,月)=年-1,如月<3;否则,f(年,月)=年。 g(月)=月+13,如月<3;否则,g(月)=月+1。 然后计算: d=(N-621049)%7 d 值为 0~6 中的某个整数,代表一周中星期日~星期六的某一天。
cin >> a[i]; bn = 0; for(i = 0; i < n; i++){
left=0 ; right=bn-1 ; /* 设定初始查找区间 */ while(left<=right) {
m=(left+right)/2 ; if (a[i]==b[m]) break; else if (a[i]>b[m])
cout << "x"; } cout << endl; return 0; } 7. 采用筛选法求质数。算法思想简述如下: (1)将数组中下标为 0 和 1 的元素设置为 0,下标为 2~N 的元素都设置为 1; (2)然后从下标为 2 的元素开始考查,当发现当前位置的数组元素值为 1 时,将下标
p3[k++][1] = p1[i][1]+p2[j][1]; } i++; j++; } } while(i < n1){ p3[k][0] = p1[i][0]; p3[k++][1] = p1[i][1]; i++; } while(j < n2){ p3[k][0] = p2[j][0]; p3[k++][1] = p2[j][1]; j++; } cout<<"和多项式为:\n"; for(i=0; i<k; i++){ if(p3[i][1] >= 0){ if(i) cout << "+";//首项不输出+号 if(p3[i][0]==0 || p3[i][1]!=1)//x 之前的系数 1 不输出
是当前下标 2 倍、3 倍、……的那些元素全部置 0 值。 (3)重复步骤 2),直至考查了数组的全部元素,哪些值依旧为 1 的元素的下标都是质
数。
答:
#include <iostream.h> #define N 10000
int sieve[N]; int n, p, i, j; int main(){
left=m+1; else
right=m-1; } if (left > right){
for(int j = bn; j > left; j--) b[j] = b[j-1];
b[left] = a[i]; bn++; } } for(i = 0; i < bn; i++) cout << b[i] << "\t"; cout << "\n"; return 0; } 5. 设有序数组有 n 个元素,数组中连续相等的元素段称为数组的平台。试找出数组最长平 台的元素个数。规定若数组的元素互不相等,则它的最长平台长为 1。 答:
cout << "输入正整数范围(<10000).\n"; cin >> n; sieve[0] = sieve[1] = 0; for(i = 2; i <= n ; i++)
sieve[i] = 1; p = 2; while(p < n){
for(i = p, p = n; i < n; i++) if(sieve[i] == 1){ p = i+1; for(j = 2*i; j < n; j += i) sieve[j] = 0; break; }
cin >> a[i]; length = 1;
for(i = 1; i < n; i++){ if(a[i-length] == a[i]) length++; }
cout << "最长的平台长" << length << "\n"; return 0; } 6. 输入两个多项式的各项系数和指数,编写程序求出它们的和,并要求与手写习惯相同的 格式输出。 规定:一个多项式的输入以输入指数为负数结束。多项式的每一项 axb 用 ax^b 格式输 出。
习题四
1. 用 C 代码描述以下计算要求: (1)输出一维数组中下标是 4 的倍数的元素。 (2)自左至右在一维数组中找第一个值为 key 的元素的下标。 (3)将一维数组中的元素按与原先存储顺序相反的顺序重新存储。
答: (1) 设数组为 a,有 N 个元素。 for(int i = 0; i < N; i+=4)
#include <iostream.h> #define N 100 int a[N], b[N];
int n, bn, left, right, i, m; int main(){
cout << "输入数组 a[]的元素个数.\n"; cin >>n; cout<<"输入数组 a[]的"<<n<<"个元素.\n"; for(i=0; i<n; i++)
printf("%c(%d)\t", i+'A', count[i]); printf("\n"); return 0; } 3. 输入 C 程序源程序正文,找出可能存在的圆括号和花括号不匹配的错误。 答:
#include <stdio.h> int main() { char buf[120];
cin >> p; if(p < 0) break; cin >> c; p1[n1][0] = p; p1[n1++][1] = c; } cout << "输入多顶式 2,按幂次由高到低顺序(幂次-1 结束).\n"; for(n2 = i = 0; ; i++){ cin >> p; if(p < 0) break; cin >> c; p2[n2][0] = p; p2[n2++][1] = c; } i = 0; j = 0, k = 0; while(i < n1 && j < n2){
while (primes[k]*prห้องสมุดไป่ตู้mes[k] <= m)
if (m % primes[k] == 0) { /* m 是合数 */
m +=2; /* 让 m 取下一个奇数 */
k = 1; /* 不必用 primes[0] = 2 去测试 m,所以 k 从 1 开始 */
}
else
k++; /* 继续用下一个质数去测试 */
if(r <= 0) index[pc++] = i;
r--; } else if(buf[i]=='{') f++; else if (buf[i]=='}'){
if(f <= 0) index[pc++] = -i;
f--; } if (r>0) index[pc++] = i; else if(f>0) index[pc++] = -i; for(i = 0; i < pc; i++) if(index[i] > 0)
printf("%4d\t", a[i]); printf("\n"); (2)设数组为 a,有 N 个元素。代码在找到时在变量 index 中存储找到元素的下标,当数组中
没有值为 key 的元素时,index 取-1。 index = -1; for(int i = 0; i < N; i++)
if(a[i] == key){ index = i; break;
printf("花括号不配对(%d)!\n", index[i]); else
printf("方括号不配对(%d)!\n", -index[i]); if(pc == 0)
printf("括号配对!\n"); return 0; } 4. 编写将已知数组内容复制到另一个新数组,使复制产生的新数组包含已知数组全部出现 过的值,而又不重复。 答: