内容发布更新时间 : 2025/11/1 3:21:43星期一 下面是文章的全部内容请认真阅读。
WORD格式可编辑
}
printf(\
printf(\当k=%d时s有最大值: %ld\\n\printf(\当k=%d时s有最小值: %ld\\n\}
2-5 特定数字组成的平方数
用数字2,3,5,6,7,8,9可组成多少个没有重复数字的7位平方数? 解:求出最小7位数的平方根b, 最大7位数的平方根c.
用a枚举[b,c]中的所有整数,计算d=a*a,这样确保所求平方数在d中。 设置f数组统计d中各个数字的个数。如果f[3]=2,即平方数d中有2个“3”。 检测若f[k]>1(k=0——9),说明d中存在有重复数字,返回。
在不存在重复数字的情形下,检测若f[0]+f[1]+f[4]=0,说明7位平方数d中没有数字“0”,“1”,“4”,d满足题意要求,打印输出。
// 组成没有重复数字的7位平方数  #include 
{int k,m,n,t,f[10]; long a,b,c,d,w; n=0;
b=sqrt(2356789);c=sqrt(9876532); for(a=b;a<=c;a++)
{d=a*a; w=d; // 确保d为平方数 for(k=0;k<=9;k++) f[k]=0; while(w>0)
{ m=w;f[m]++;w=w/10;} for(t=0,k=1;k<=9;k++)
if(f[k]>1) t=1; // 测试三个平方数是否有重复数字
if(t==0 && f[0]+f[1]+f[4]==0) // 测试平方数中没有数字0,1,4 {n++;
printf(\
printf(\ } }
printf(\共可组成%d个没有重复数字的7位平方数.\\n\}
专业知识分享
WORD格式可编辑
2-6 写出例2-2中对称方阵的完整程序,并运行程序。 对称方阵程序:
#include 
{int i,j,n,a[30][30];
printf(\请确定方阵阶数n: \ scanf(\
for(i=1;i<=n;i++) for(j=1;j<=n;j++)
{if(i+j<=n+1 && i<=j)
   a[i][j]=(n+1)/2-i+1;         // 方阵上部元素赋值      if(i+j
a[i][j]=(n+1)/2-j+1; // 方阵左部元素赋值 if(i+j>=n+1 && i>=j)
   a[i][j]=i-n/2;               // 方阵下部元素赋值      if(i+j>n+1 && i    a[i][j]=j-n/2;               // 方阵右部元素赋值     }   printf(\阶对称方阵为:\\n\ for(i=1;i<=n;i++)     { for(j=1;j<=n;j++)          // 输出对称方阵          printf(\      printf(\    }  }    2-7  四则运算式  把数字1,2,...,9这9个数字填入以下含加减乘除的综合运算式中的9个□中,?使得该式成立  □□×□+□□□÷□-□□=0             要求数字1,2,...,9这9个数字在各式中都出现一次且只出现一次,且约定数字“1”不出现在数式的一位数中(即排除各式中的各个1位数为1这一平凡情形)。    (1) 求解要点  设式右的5个整数从左至右分别为a,b,c,d,e,其中a,e为二位整数,b,d为大于1的一位整数,c为三位整数。设置a,b,c,d循环,对每一组a,b,c,d,计算e=a*b+c/d。若其中的c/d非整数,或所得e非二位数,则返回。                         专业知识分享                         WORD格式可编辑  然后分别对5个整数进行数字分离,设置f数组对5个整数分离的共9个数字进行统计,f(x)即为数字x(1—9)的个数。  若某一f(x)不为1,不满足数字1,2,...,9这九个数字都出现一次且只出现一次,标记t=1.  若所有f(x)全为1,满足数字1,2,...,9这九个数字都出现一次且只出现一次,保持标记t=0, 则输出所得的完美综合运算式。  设置n统计解的个数。 (2) 程序实现 // 四则运算式   #include  {int x,y,t,k,a,b,c,d,e,n=0;  int m[6],f[11];  for(a=12;a<=98;a++)  for(b=2;b<=9;b++)   for(c=123;c<=987;c++)         //  对a,b,c,d 实施枚举    for(d=2;d<=9;d++)      {x=c/d;e=a*b+x;        if(c!=x*d || e>100) continue;        m[1]=a;m[2]=c;m[3]=e;m[4]=b;m[5]=d;       for(x=0;x<=9;x++) f[x]=0;       for(k=1;k<=5;k++)         {y=m[k];          while(y>0)            {x=y;f[x]=f[x]+1;  y=(y-x)/10;        //  分离数字f数组统计  }           }         for(t=0,x=1;x<=9;x++)          if(f[x]!=1)             {t=1; break;}      //  检验数字0--9各只出现一次                     if(t==0)               //  输出一个解,用n统计个数           {n++;   printf(\          }      }   printf(\ }                          专业知识分享                         WORD格式可编辑  2-8  合数世纪探求  定义一个世纪的100个年号中不存在一个素数,即100个年号全为合数的世纪称为合数世纪。  探索最早的合数世纪。 (1) 设计要点  应用穷举搜索,设置a世纪的的50个奇数年号(偶数年号无疑均为合数)为b,用k试商判别b是否为素数,用变量s统计这50个奇数中的合数的个数。  对于a世纪,若s=50,即50个奇数都为合数,找到a世纪为最早的合数世纪,打印输出后退出循环结束。  (2) 合数世纪程序设计 // 合数世纪探求  #include  {long a,b,k; int s,x;  a=1;   while (1)               {a++;s=0;                          // 检验a世纪       for(b=a*100-99;b<=a*100-1;b+=2)   // 穷举a世纪奇数年号b        {x=0;         for(k=3;k<=sqrt(b);k+=2)          if(b%k==0)              {x=1;break;}         if(x==0)break;   // 当前为非合数世纪时,跳出循环进行下世纪的探求        s=s+x;           // 年号b为合数时,x=1,s增1        }      if(s==50)           //  s=50,即50个奇数均为合数         { printf(\最早出现的合数世纪为 %ld 世纪!\\n\ break; }      } }   2-9  最小连续n个合数 试求出最小的连续n个合数。(其中n是键盘输入的任意正整数。)       (1)设计要点      求出区间[c,d]内的所有素数(区间起始数c可由小到大递增),检验其中每相邻两素数之                        专业知识分享