2002年真题
1编程序输出整数n 的全部素数因子。例如: n=120 时,素因子为:2,2,2,3,5
所谓找素数因子其实就是不断用素数去试探能不能整除n,若能再试探这个素数是否可以继续整除,直到这个素数不能被整除了,就用另外一个素数去试探,直到这个整数除完为0.
1 #include <stdio.h> 2 #include <stdlib.h> 3 #include<math.h> 4 5 int is_prime(int n){ 6 int i; 7 int flag=1; 8 9 for(i=2;i<sqrt(n);i++){ 10 if(n%i==0) 11 flag=0; 12 } 13 return flag; 14 } 15 16 void factor(int n){ 17 int i=2; 18 while(i<=n){ 19 20 if(n%i==0&&is_prime(i)){ 21 printf("%d ",i); 22 n/=i; 23 }else 24 i++; 25 } 26 } 27 28 int main() 29 { 30 int n; 31 printf("n="); 32 scanf("%d",&n); 33 factor(n); 34 return 0; 35 }
运行结果:

2.对数组A中的N (0<N<100)个整数从小到大进行连续编号,要求不能改变数组A中元素的顺序,且相同的整数具有相同的编号。
例如:
A=(5,3,4,7,3,5,6)则输出为:(3,1,2,5,1,3,4)
1 #include <stdio.h> 2 #include <stdlib.h> 3 #define N 7 4 #define INF 100000000 5 static int visit[N];//当visit[i]为1时表示i位置的数已经被访问过了。 6 static int visited=0;//表示已经编好号的数的个数 7 void id(int sort[],int A[],int count,int min){ 8 int i; 9 for(i=0;i<N;i++){ 10 if(A[i]==min){ 11 sort[i]=count; 12 visit[i]=1; 13 visited++; 14 } 15 } 16 } 17 int main() 18 { 19 int count=1; 20 21 int min; 22 int i; 23 int A[]={5,3,4,7,3,5,6}; 24 int idsort[N]={0}; 25 26 while(visited<N){ 27 min=INF; 28 for(i=0;i<N;i++){ 29 if(visit[i]==0&&A[i]<min) 30 min=A[i]; 31 } 32 id(idsort,A,count,min); 33 count++; 34 } 35 printf("A:"); 36 for(i=0;i<N;i++) 37 printf("%d ",A[i]); 38 printf("\n"); 39 40 printf("id:"); 41 for(i=0;i<N;i++) 42 printf("%d ",idsort[i]); 43 printf("\n"); 44 return 0; 45 }
运行结果:

改了一下visited变量位置,当时在idsort函数的一个形参设置为int *visited由于在用visited时不是(* visited)++而是写成了visited++导致出错
注意不能写成*visited++,由于*和++同一优先级 而结合方向是自右向左的 所以先visited++ 由于++是后置所以visited++表达式值为visited 再做*visited得到值 最后visited自增一个单位(跳了4个字节)
例如:

1 #include <stdio.h> 2 #include <stdlib.h> 3 #define N 7 4 #define INF 100000000 5 static int visit[N];//当visit[i]为1时表示i位置的数已经被访问过了。 6 void id(int sort[],int A[],int count,int min,int *visited){ 7 int i; 8 for(i=0;i<N;i++){ 9 if(A[i]==min){ 10 sort[i]=count; 11 visit[i]=1; 12 (*visited)++; 13 } 14 } 15 } 16 int main() 17 { 18 int count=1; 19 20 int min; 21 int i; 22 int A[]={5,3,4,7,3,5,6}; 23 int idsort[N]={0}; 24 int visited=0;//表示已经编好号的数的个数 25 while(visited<N){ 26 min=INF; 27 for(i=0;i<N;i++){ 28 if(visit[i]==0&&A[i]<min) 29 min=A[i]; 30 } 31 id(idsort,A,count,min,&visited); 32 count++; 33 } 34 printf("A:"); 35 for(i=0;i<N;i++) 36 printf("%d ",A[i]); 37 printf("\n"); 38 39 printf("id:"); 40 for(i=0;i<N;i++) 41 printf("%d ",idsort[i]); 42 printf("\n"); 43 return 0; 44 }
3.将1、2、3、4、5、6、7、8、9这九个数字分成三组,每个数字只能用一次,即每组三个数不许有重复数字,也不许同其它组的三个数字重复,要求每组中的三位数都组成一一个平方数。
步骤:
1、先把平方数为三位数的数弄出来
2、再这些平方数中筛选出个、十、百位的数字不重复的平方数保存到nums[]数组中
3、最后用三个for循环在nums[]中找三个平方数两两的数字都不重复的三位数
得到的结果只有一种:
361 529 784
1 #include <stdio.h> 2 #include <stdlib.h> 3 #include<string.h> 4 #include<math.h> 5 int repeat[10];/* 6 repeat数组表示若一个数的第i为位m则repeat[m]=1表示数字m出现过了 用于解决每一组的三个数不能重复 以及 不能与其他组三个数重复的问题》 7 */ 8 int nums[20];//用于存放满足每一组的三个数不能重复且为平方数的条件的三位数 9 10 int f(int n){//判断一个三位数的数字是否重复,若不重复则返回1,反之返回0 11 int flag=1; 12 int t=n; 13 while(t){ 14 if(repeat[t%10]==0){ 15 repeat[t%10]=1; 16 t/=10; 17 }else{ 18 flag=0; 19 break; 20 } 21 } 22 return flag; 23 } 24 25 void f2(int nums[],int count){ 26 //找出在nums中满足数字不重复的三个数 27 int i,j,k; 28 for(i=0;i<count;i++){ 29 memset(repeat,0,sizeof(repeat)); 30 f(nums[i]); 31 for(j=i+1;j<count;j++){ 32 if(f(nums[j])){ 33 for(k=j+1;k<count;k++){ 34 if(f(nums[k])) 35 printf("%d %d %d\n",nums[i],nums[j],nums[k]); 36 } 37 } 38 } 39 } 40 } 41 42 int main() 43 { 44 int i,j; 45 int count=0; 46 for(i=13;i<=31;i++){ 47 memset(repeat,0,sizeof(repeat)); 48 if(f(i*i)){ 49 nums[count++]=i*i; 50 } 51 } 52 f2(nums,count); 53 return 0; 54 }
运行结果如下:
