实验九 枚举问题(运算模拟)

实验名称:实验九 枚举问题(运算模拟)

实验目的:熟练掌握一些枚举问题的处理方法。

实验内容:

  1. 问题描述:(乘积为n个1的数字游戏)两位计算机爱好者在进行“积为n个1的数字游戏”,其中一位给定一个正整数p(约定整数p为个位数字不是5的奇数),另一位寻求正整数q,使得p与q之积为全是1组成的整数。

输入:第1行是测试数据的组数t,每组测试数据占1行,每行包括一个个位数字不是5的奇数p。

输出:对应每组测试数据输出共t行,每行输出两个整数,之间有一个空格分隔,一个是满足条件的整数q,另一个是p与q之积的1的个数。

输入样例

3       

11      

9       

89      

输出样例

1      2                                         

12345679     9                                   

124843945068664169787765293383270911360799     44

  1. 问题描述:(被除数的连写数)从1开始按正整数的顺序连续写下去所构成的整数称为连写数,要使连写数12345678901112...m(连写到m)能被给定整数p(p<1000)整除,m至少为多大?

输入:输入只有一行,为一个正整整p(p<1000)。

输出:输出为一行,包括两个整数,一个是商,另一个是整数连写数的最后一个数m,二者之间用空格分隔。

输入样例

13       

输出样例

94966760847      11

  1. 问题描述:(阶乘中找数)统计n阶乘中数字p的个数。

输入:输入只有一行,为两个正整整n、p(n≤800,0≤p≤9)。

输出:输出为两行,一行为n!,另一行为n!中数字p的个数。

输入样例

10      8

输出样例

3628800          

2                

  1. 问题描述:(尾数前移问题)整数n的尾数是q,把尾数q移到其前面(成为最高位)后所得的数为原来整数n的p倍,原整数n为多少?

输入:输入只有一行,为两个正整数q、p(2≤p≤q≤9)。

输出:输出为一行,即为所求n。

输入样例

8         4

输出样例

205128     

实验结果与分析(运行界面截图,打开需要截的图,按ALT+PrintScreen后,将光标移到下面,单击右键后选择“粘贴”):

 1.

(Ⅰ)程序代码及注释

#include <stdio.h>

int main(int argc, char *argv[])

{

int a,b,p,c,n,t,f;

scanf("%d",&t);

while(t--)

{

scanf("%d",&p);

c=0;n=0;

f=1;

while(c!=0||f!=0)

{

a=c*10+1;

c=a%p;

b=a/p;

n++;

if(f==1&&b==0)continue;

printf("%d",b);

f=0;

}

printf(" %d\n",n);

}

}

(Ⅱ)运行结果窗口截图(窗口适当缩小)和分析

2.

(Ⅰ)程序代码及注释

#include <stdio.h>

#include <string.h>

int main(int argc, char *argv[])

{

char buff[10];

int a,b,p,c,len,m,k,f;

scanf("%d",&p);

c=1;m=1;

f=0;

while(c!=0)

{

m++;

sprintf(buff,"%d",m);

len=strlen(buff);

k=0;

while(k<len)

{

a=c*10+buff[k]-'0';

k++;

c=a%p;

b=a/p;

if(f==0&&b==0)continue;

f=1;

printf("%d",b);

}

}

printf(" %d\n",m);

}

(Ⅱ)运行结果窗口截图(窗口适当缩小)和分析

3.

(Ⅰ)程序代码及注释

#include <stdio.h>

int main(int argc, char *argv[])

{

int n,p,a,m,i,j,k,w[2000],s;

scanf("%d%d",&n,&p);

w[0]=1;k=0;

for(i=1;i<=n;i++)

{

m=0;

for(j=0;j<=k;j++)

{

a=w[j]*i+m;

w[j]=a%10;

m=a/10;

}

while(m>0)

{

k++;

w[k]=m%10;

m=m/10;

}

}

for(s=0,i=k;i>=0;i--)

{

printf("%d",w[i]);

if(w[i]==p)s++;

}

printf("\n%d\n",s);

}

(Ⅱ)运行结果窗口截图(窗口适当缩小)和分析

4.

(Ⅰ)程序代码及注释

#include <stdio.h>

int main(int argc, char *argv[])

{

int a,m,j,k,p,q,w[100];

scanf("%d%d",&q,&p);

w[1]=q;m=0;k=1;a=p*q;

while(a!=q)

{

a=w[k]*p+m;

k++;

w[k]=a%10;

m=a/10;

}

for(j=k-1;j>=1;j--)

printf("%d",w[j]);

printf("\n");

}

(Ⅱ)运行结果窗口截图(窗口适当缩小)和分析

  • 25
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值