定义函数Rand1000(), 随机生成1000个均不相同的正整数

要求实现如下功能:
(1)定义函数Rand1000(), 随机生成1000个均不相同的正整数,并写入到文本文件“file1.dat” 中,各数之间用空格来分隔。
(2)编写一个函数input(int a[],int n),将上述数据读入到数组a中。
(3)编写一个函数digitcount(int a[],int n,int b[10]), 统计数组a的每个元素保存的整数中,每位数字出现的次数,并分别保存在b[0]到b[9]中。

(4)编写函数maxprime(int *p,int n), 找出其中最大的素数,如果不存在素数函数结果为0。

(5) 对于这些整数排序之后,分别输出相邻两数之差最大和之差最小的两个数,如果有多组满足条件要输出所有的。

(6)定义函数myinput(int a[],int n),用fgetc函数从文件“file1.dat”上逐个读入字符,并将其转换成独立的正整数,并依次存入数组a中。


#include<stdio.h>
#include<math.h>
#include<stdlib.h>


/* 建立n个随机数序列d【】 */ 
int creat_random(int d[],int n)
{ int i,k;
  FILE *fp;
  srand((unsigned)time(NULL)); 
  for(i=0;i<n;i++)
  {   d[i]=rand();
      for(k=0;k<i;k++)
         if(d[k]==d[i]) {  k=0; d[i]=rand();  }   /*去掉重复数据*/    
      printf("%d    ",d[i]);
      }
   printf("\n======End  Creat=======\n");
   fp=fopen("file1.dat","w");
   for(i=0;i<n;i++)
  {   fprintf(fp,"%d    ",d[i]);
      }
   fclose(fp);   
}


/* 读数据文件 */
int input(char filename[30],int a[])
{  FILE *fp;
   int i,k=0;
   printf("\n======Read File=======\n");
   if((fp=fopen(filename,"r"))==NULL)
   {   printf("Read File Error");   return 0;  }
   while(!feof(fp))
   {   fscanf(fp,"%d",&a[k]);   k=k+1;  }
    printf("\n End File total_records=%d\n",k); 
   return k-1;



/*统计数字个数*/ 
digitcount(int a[],int n,int b[10]) 
{  int i,k;
   printf("\n======Begin digitcount======\n");   
   for(i=0;i<10;i++)
      b[i]=0;
   for(i=0;i<n;i++)   
   {   k=a[i];
       while(k!=0)
       {  b[k%10]++;  k=k/10;  }
   }
   for(i=0;i<10;i++)
      printf("%d  ",b[i]);
   printf("\n======End digitcount======\n") ;                    
}


/* 为数据排序 */
sort(int d[],int total)
{  int i,k,temp;
   printf("\n======Begin sort======\n");   
   for(i=1;i<total;i++)
   {   for(k=i-1,temp=d[i];k>=0;k--)
       {   if(d[k]<temp) d[k+1]=d[k];
           else { d[k+1]=temp;  break;  }  
         } 
        if(k<0) d[0]=temp;
    }    
    for(i=0;i<total;i++)
       printf("%d   ",d[i]);
    printf("\n======End sort======\n");      
}


/*确定最大的素数*/
int maxprime(int *p,int n)
{   int i,k,j;
    for(i=0;i<n;i++)
    {   k=p[i];
        for(j=2;j<=sqrt(k*1.0)+1;j++)   
            if(k%j==0) break;  
        if(j>sqrt(k*1.0)+1)  return i;  /*p[i]是最大素数*/
    } 
    return -1;  /*不包含素数*/
}


/*两数之差最大、最小*/
max_min(int *p,int n)
{   int max=p[0]-p[1],min=p[0]-p[1],difference;
    int i,k;
    for(i=0;i<n-1;i++)
    {   difference=fabs(p[i]-p[i+1]);
        if(difference>max)  max=difference;
        if(difference<min)  min=difference;
    }
    for(i=0;i<n-1;i++)
    {   if(max==fabs(p[i]-p[i+1])) 
          printf("Max difference: d[%d]-d[%d]=%d\n",i,i+1,(int)fabs(p[i]-p[i+1]));
        if(min==fabs(p[i]-p[i+1]))
          printf("Min difference: d[%d]-d[%d]=%d\n",i,i+1,(int)fabs(p[i]-p[i+1]));        
     }
}
    
/*字符数据转换*/ 
void Transformation(char *fn,int *p)
{  FILE *fp;
   char d[10];
   int k,temp,i=0;
   fp=fopen(fn,"r");
   printf("\n====== Begin Transformation ======\n"); 
    while(!feof(fp))
   {   k=0;
       temp=fgetc(fp);
       /*32:空格   13:回车   10:换行*/
       while( temp==32 ||temp==13 || temp==10) temp=fgetc(fp);
       while(temp!=32 && !feof(fp))   /* 32是空格的内码 */ 
       { d[k]=temp; k++; temp=fgetc(fp);  }
       d[k]='\0';   
       p[i]=atoi(d);  
       i++;
   }
    printf("\nTotal number is: %d\n",i-1);
    fclose(fp);
    for(k=0;k<i-1;k++)
       printf("%d  ",p[k]);
    printf("\n====== End Transformation ======\n");    



int main()
{  int data[10000],n=10,total_records,b[10],max_prime;
   char filename[]={"file1.dat"};
    creat_random(data,n); 
    total_records=input(filename,data);
    digitcount(data,total_records,b);
    sort(data,total_records);
    max_prime=maxprime(data,total_records);
    if(max_prime!=-1) 
       printf("\n MaxPrime=data[%d]:%d\n\n",max_prime,data[max_prime]);
    else
        printf("\n====== 指定数据中不包含素数!======\n\n");
    max_min(data,total_records);
    Transformation(filename,data);
    system("pause");
    }
  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值