计算概论(C语言)习题课讲义06 内容概要 习题讲解 前五章梳理 课堂练习 习题讲解 哥德巴赫猜想的验证 算法框架: int prime(int n); //判断输入n是否为素数 int goldbach(int n); //判断输入n是否可以分解为两个素数之和 同学代码点评一: #include<stdio.h> #include<math.h> #include<time.h> int isprime(int n){ for(int m=2;m*m<=n;++m){ if (n%m==0) return 0;} return 1; } int main(){ for(;;){ int a=0,t,n;double time1=0; printf("请输入需要分解的偶数,输入奇数结束程序:") ; scanf("%d",&n); time1=clock(); if(n%2==0&&n>4){ for(t=3;t<=n/2;t+=2){ if (isprime(t)&&isprime(n-t)){ printf("%d=%d+%d\n",n,t,n-t); a=a+1; } } printf("共有%d组,用时%f秒\n\n",a,(clock()-time1)/CLOCKS_PER_SEC); } else{ printf("程序结束"); return 0; } } } 同学代码点评二: #include<stdio.h> #include<stdlib.h> #include<math.h> int prime(int n){ int m; for(m=2;m<=n;++m){ if(n%m==0){ break; } } if(m==n) return 1; else return 0; } int main(){ int m,n,t; scanf("%d",&n); for(m=6;m<=n;m=m+2){ for(t=3;t<=m-3;t=t+2){ if (prime(t)==1 && prime(m-t)==1){ printf("%d=%d+%d\n",m,t,m-t); break; } } if(t==m-3 && m>=8){ printf("推翻了哥德巴赫猜想!!!!!!\n"); break; }} if(m==n+2) printf("哥德巴赫猜想在小于等于%d成立\n",n); return 0; } C语言代码规范 虽然C语言的标准中并没有对代码的缩进和换行有硬性的要求,但一般大家都会有一些通俗的约定.这里推荐使用如下的代码缩进风格:...

Me

计算概论(C语言)习题课讲义07 内容概要 习题讲解 数组初步 课堂练习 习题讲解 输出一定范围勾股数 代码点评一: #include <stdio.h> void output(int min, int max) { int i,j,k; //简单粗暴,三重循环; for(i=min;i<=max;i++) { for(j=i;j<=max;j++) { for(k=j;k<=max;k++) { if(i*i+j*j==k*k) { printf("%d %d %d\n",i,j,k); } } } } } int main() { int min,max; scanf("%d%d", &min, &max); output(min,max); return 0; } 代码点评二: #include <stdio.h> #include <math.h> int perfect(int s){ int n; for(n=1;n*n<=s;n=n+1) if(n*n==s) return 1; return 0; } int ssqrt(int s){ int n; for(n=1;n*n<=s;n=n+1) if(n*n==s) return n; return 0; } void haha(int m,int n){ int s; int a;int b; for(s=m;s<n;s=s+1) {for(a=m+1;a<=n;a=a+1) if(perfect(a*a-s*s)&(s*s<a*a/2)) printf("%d %d %d\n",s,ssqrt(a*a-s*s),a); } } int main(){ int min,max; scanf("%d%d",&min,&max); haha(min,max); } Collatz函数 两个注意点:...

Me

计算概论(C语言)习题课讲义08 内容概要 习题讲解 数组进阶 课堂练习: 排序初步 习题讲解 输出所有字符数不超过10的行 代码点评一: 读入一行 =>如何判断读入一行? 进行判断 少十输出 =>输出时, 结果如何存储? 否则跳过 #include <stdio.h> int main() { char Line[1000]; char c; int count=0; while((c=getchar())!=EOF) { Line[count++]=c; if(c=='\n') //读入一行 { //进行判断 if(count<=10) //输出 { for(int i=0;i<count;i++) { putchar(Line[i]); } } else //跳过 { } count=0; } } return 0; } 代码点评二: #include <stdio.h> #include <string.h> // string.h? int main(){ int i=0,c,k; int line[10]; while((c=getchar())!=EOF) { if(i==10) { i=0; while(getchar()!...

Me

计算概论(C语言)习题课讲义09 内容概要 习题讲解 字符串 课堂练习: 排序初步 习题讲解 字符串转浮点数 代码点评一: #include <stdio.h> double t(char a[],const int n) { double x=0; int m=n; if (a[0]=='\0') return 0.; for(int i=0;i<n;++i) { if(a[i]=='.') m=i; //记录小数点位置 } for (int i=0;i<m;++i) { x=x*10+a[i]-'0'; } for(int i=m+1,j=10;i<n;++i) //处理小数点 { x=x+(a[i]-'0')/(double)j; j*=10; } return x; } int main(int argc, const char * argv[]) { char a[5]={'.','1','2','3','\0'}; //可以使用字符串,对字符数组初始化 char b[4]={'1','2','3','\0'}; char c[8]={'1','2','3','.','1','2','3','\0'}; char d[1]={'\0'}; printf("The real number of 1st input string is: %f\n",t(d,1)); printf("The real number of 2st input string is: %f\n",t(a,4)); printf("The real number of 3st input string is: %f\n",t(b,3)); printf("The real number of 4st input string is: %f\n",t(c,7)); return 0; } 代码点评二:...

Me

计算概论(C语言)习题课讲义10 内容概要 习题讲解 指针 课堂练习 习题讲解 字典序输出所有排列 代码点评一: #include <stdio.h> #define Nmax 100 void print(int A[], int n) { for(int i=0;i<n;i++) { printf("%d",A[i]); } printf("\n"); } void swap(int A[], int m, int n) //交换两元素 { int tmp=A[m]; A[m]=A[n]; A[n]=tmp; } int next(int A[], int n) { int k,i; for(k=n-2;A[k]>A[k+1]&&k>=0;k--); // Find first(right to left) A[k]<A[k+1] if(k<0) return 0; // This means A[j]>A[j+1] for all j // Maximum in lexicographical order; for(i=n-1;A[k]>A[i];i--); // Find minimal A[i]>A[k] swap(A,k,i); // Exchange A[i] and A[k] //Sort A[k+1]--A[n-1]; Any sort is OK; But Notice it's in reverse order k=k+1,i=n-1; while(k<i) { swap(A,k,i); k++; i--; } return 1; } int main() { int A[Nmax], n; scanf("%d",&n); for(int i=0;i<n;i++) { A[i]=i+1; } do{ print(A,n); }while(next(A,n)); return 0; } 代码点评二:...

Me