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 }

运行结果如下: