word
1/11
1、请编写程序求解下式的值〔n、k的值从键盘转入〕:
2、教授最近正在研究一个项目,其间涉与到十进制与十六进制之间的转换,然而,手工将
大量的十进制转换成十六进制是十分困难的。请编写程序,将给定的非负十进制数转化成
相应的十六进制数并输出〔用A、B、C、D、E、F分别表示十六进制的10、11、12、13、
14、15〕。
3、输入一个字母打印图示图形,该图形中间一行由输入字母组成,其相邻的上下两行由它
前面的字母组成,按此规律,直到字母A出现在第一行和最末行为止。如如如下图:
A
BB
CCC
DDDD
CCC
BB
A
4、试编程从N位数字串中删去M个数使剩下的数字串所表示的数值最小。
5、孪生数是指两个相差为2的素数,如3和5,5和7,11和13。请编写程序输出15对
孪生数。
6、编写程序找出文件中最长和最短的正文行并统计文件中的行数〔假定最长行不超过80
个字符〕。
7、数列总是有一些奇妙的性质。现有一数列A,它是以递增顺序排列的,并且该数列中所
有的数的质因子只有可能是2、3和5。请编写程序输出这个数列中的前N个数字。
8、试编写程序实现两个大的整数的乘法运算。
参考答案:
//1、请编写程序求解下式的值〔n、k的值从键盘转入〕:
#include
#include
voidmain(void)
{
intn,k,x;
doublesum=0;
printf("请输入n和k的值:");
scanf("%d%d",&n,&k);
word
2/11
for(x=1;x<=n;x++)
sum+=pow(x,k);//注意计算次方的函数
printf("所求结果为:%fn",sum);
}
//2、教授最近正在研究一个项目,其间涉与到十进制与十六进制之间的转换,然而,手工
将大量的十进制转换成十六进制是十分困难的。请编写程序,将给定的非负十进制数转化
成相应的十六进制数并输出〔用A、B、C、D、E、F分别表示十六进制的10、11、12、13、
14、15〕。
#include
voidmain(void)
{
intdata10,beichushu,yushu,shang;
chardata16[10],p=0;//数组data16用于存放十六进制各位上的数
do
{
printf("请输入一个非负十进制数:");
scanf("%d",&data10);
}while(data10<0);
beichushu=data10;//将初始值作为被除数
//以下循环用于完成转换
do
{
shang=beichushu/16;//求商
yushu=beichushu%16;//求余数
if(yushu<10)//小于10如此转换得到对应数字字符
data16[p++]=yushu+'0';
el//大于等于10如此转换得到对应字母
data16[p++]=yushu-10+'A';
beichushu=shang;//将商作为下次的被除数继续除
}while(shang!=0);
printf("十进制数%d所对应的十六进制数为:",data10);
for(p--;p>=0;p--)
printf("%c",data16[p]);
printf("n");
}
//3、输入一个字母打印图示图形,该图形中间一行由输入字母组成,其相邻的上下两行由
它前面的字母组成,按此规律,直到字母A出现在第一行和最末行为止。如如如下图:
#include
voidmain(void)
{
word
3/11
charch,row,col;
do
{
printf("请输入中间行所对应的字母〔大写〕:");
scanf("%c",&ch);
}while((ch<'A')||(ch>'Z'));
//输出图形的上半局部
for(row=1;row<=ch-'A'+1;row++)//控制行数
{
for(col=1;col<=ch-'A'-row+1;col++)//输出相应个数空格以控制位置
printf("");
for(col=1;col<=row;col++)//输出相应个数字母
printf("%c",row+'A'-1);
printf("n");//换行
}
//输出图形的下半局部
for(row=1;row<=ch-'A';row++)//控制行数
{
for(col=1;col<=row;col++)//输出相应个数空格以控制位置
printf("");
for(col=1;col<=ch-'A'-row+1;col++)//输出相应个数字母
printf("%c",ch-row);
printf("n");//换行
}
}
//4、试编程从N位数字串中删去M个数使剩下的数字串所表示的数值最小。
#include"stdio.h"
#include"string.h"
#defineN80
voidmain()
{
charstr[N+1];
inti,j,n,m,yn;//yn用于判断数字串有是否有逆序对,1-有,0-无
printf("请输入原始数字串:");
scanf("%s",str);
printf("原始数字串为:%sn",str);
n=strlen(str);
word
4/11
do
{
printf("请输入要删除的数的位数〔0-%d〕:",n);
scanf("%d",&m);
}while((m<0)||(m>n));
yn=1;
while((m>0)&&(yn))//有逆序对时删除较大者
{
yn=0;
for(i=0;(str[i+1]!='0')&&(yn==0);i++)
if(str[i]>str[i+1])//有逆序对
{
for(j=i;str[j+1]!='0';j++)
str[j]=str[j+1];
str[j]='0';
m--;
yn=1;
}
};
if(m>0)
str[strlen(str)-m]='0';
printf("%sn",str);
}
//5、孪生数是指两个相差为2的素数,如3和5,5和7,11和13。请编写程序输出15对
孪生数。
//注意:1既不是素数,也不是合数,2是最小的素数,也是唯一的偶素数
#include
//判断x是否为素数,假设是如此返回1,否如此返回0
intjudge(intx)
{
inti,yn;
yn=1;//为1表示是素数
for(i=2;(i
if(x%i==0)
yn=0;
returnyn;
}
voidmain(void)
word
5/11
{
unsignedi=2,count=1,d1,d2;
while(count<=15)
{
d1=i;
d2=d1+2;
i++;
if(judge(d1)&&judge(d2))
printf("No.%2d:%10d%10dn",count++,d1,d2);
}
}
//6、编写程序找出文件中最长和最短的正文行并统计文件中的行数〔假定最长行不超过80
个字符〕。
#include
#include
#include
#defineN80
voidmain(void)
{
unsignedcount=1,maxno,minno;
charmax[N+1],min[N+1],cur[N+1],fname[N+1];
FILE*fp;
printf("请输入文件名:");//输入文件名
scanf("%s",fname);
fp=fopen(fname,"r");
if(fp==NULL)
printf("文件无法打开!n");
el
{
while(!feof(fp))//文件没完毕时反复读取并判断
{
fgets(cur,N,fp);//读取一行
if(count==1)//假设为第一行如此当其为目前的最长与最短行
{
maxno=1;
minno=1;
strcpy(max,cur);
strcpy(min,cur);
}
el//假设不是第一行
{
word
6/11
if(strlen(max)
{
maxno=count;
strcpy(max,cur);
}
if(strlen(min)>strlen(cur))//新的最短行
{
minno=count;
strcpy(min,cur);
}
}
count++;//行号增1
};
fclo(fp);
printf("文件共有%d行n",count-1);
printf("最长行为第%d行,其容为:%sn",maxno,max);
printf("最短行为第%d行,其容为:%sn",minno,min);
}
}
//7、数列总是有一些奇妙的性质。现有一数列A,它是以递增顺序排列的,并且该数列中
所有的数的质因子只有可能是2、3和5。请编写程序输出这个数列中的前N个数字。
#include
//此题的关键是如何分解出一个数x所有的质因子
//下面函数用于判断x的质因子是否仅为2、3或5,是如此返回1,否如此返回0
intjudge(intx)
{
inti=2,yn;
yn=1;
while((x>=i)&&(yn))
{
if(x%i==0)//如果能整除
{
if(!((i==2)||(i==3)||(i==5)))//质因子不是2、3或5
yn=0;
while((x%i==0)&&(yn))
x/=i;
}
i++;
};
returnyn;
}
voidmain(void)
word
7/11
{
intn,i,count=0;
do
{
printf("请输入要求的数列元素的个数〔>=1〕:");
scanf("%d",&n);
}while(n<1);
for(i=2;count
if(judge(i))
printf("No.%5d:%10dn",++count,i);
printf("n");
}
//8、试编写程序实现两个大的整数的乘法运算。
#include
#include
#include
#defineN100
//逆置,因为计算机中数据的上下位跟现实中的习惯刚好相反
voidrevert(chart[])
{
inti,len;
chartemp;
len=strlen(t);
for(i=1;i<=len/2;i++)
{
temp=t[i-1];
t[i-1]=t[len-i];
t[len-i]=temp;
}
}
//以字符串形式输入被乘数和乘数
voidinput(chara[],charb[])
{
do
{
printf("n请输入要进展乘法运算的两个整数〔单个数不要超%d位〕:n",N);
scanf("%s%s",a,b);
}while((strlen(a)>N)||(strlen(b)>N));
}
//对两个数实现乘法运算
word
8/11
char*multiply(chara[],charb[])
{
char*p;
unsignedinti,j,x,y,r1,r2,r3;
p=(char*)malloc(1+strlen(a)+strlen(b));
//对存放乘积的空间进展初始化
p[strlen(a)+strlen(b)]='0';
for(i=0;i
p[i]='0';
//进展乘法运算
for(i=0;i
{
y=b[i]-'0';
for(j=0;j
{
x=a[j]-'0';
r1=x*y+(p[j+i]-'0');
r2=r1%10;
r3=r1/10;
p[j+i]=r2+'0';
p[j+i+1]=p[j+i+1]-'0'+r3+'0';
}
}
//将前导0取消
for(i=strlen(p);(i>=0)&&(p[i-1]=='0');i--)
p[i-1]='0';
return(p);
}
voidmain()
{
chara[N],b[N],c[2*N];
input(a,b);
//逆置,以方便运算
revert(a);
revert(b);
strcpy(c,multiply(a,b));
//逆置,以便于跟现实中的上下位顺序一致
revert(a);
revert(b);
revert(c);
word
9/11
printf("%s*%s=%sn",a,b,c);
system("pau");
}
//一种改良算法
//以下程序实现两个比拟大的正整数相乘,可以得出准确
//的结果:
#include
#include
#include
#defineWEISHU4//每组包含的位数
#defineMAXLEN10000//单个数字最多位数
//逆置,因为计算机中数据的上下位跟现实中的习惯刚好相反
voidrevert(char*data)
{
unsignedshorti,len;
chartemp;
len=strlen(data);
for(i=1;i<=len/2;i++)
{
temp=data[i-1];
data[i-1]=data[len-i];
data[len-i]=temp;
}
}
//将字符串形式的数据分组并转换成unsignedshort形式
//的数据,每组长度为weishu,0号元素存放组数(系数个数)
voidstoi(char*str,unsignedshort*data)
{
unsignedshorts=0,i,j=1,quan=1;
for(i=0;str[i]!='0';i++)
{
s=s+quan*(str[i]-'0');
quan*=10;
if((i+1)%WEISHU==0)
{
data[j++]=s;s=0;quan=1;
}
}
if(i%WEISHU!=0)
data[j++]=s;
data[0]=j-1;
}
//从键盘输入数据并暂存入一个字符数组
word
10/11
voidinput(char*str,unsignedshort*data)
{
printf("请输入一个正整数:n");
scanf("%s",str);
revert(str);//逆置
stoi(str,data);//分组并转换
}
//对两个数实现乘法运算
unsignedshort*multiply(unsignedshort*a,unsignedshort*b)
{
unsignedshort*p,i,j,ba=1;
unsignedinttemp;
for(i=1;i<=WEISHU;i++)//计算相应的基
ba*=10;
//给乘积的存放准备空间
p=(unsignedshort*)malloc((a[0]+b[0]+1)*sizeof(unsignedshort));
if(p==NULL)
returnNULL;//存分配不成功,无法进展运算
el
{
p[0]=a[0]+b[0];
//对存放乘积的空间进展初始化
for(i=1;i<=p[0];i++)
p[i]=0;
//进展乘法运算
for(i=1;i<=b[0];i++)
{
for(j=1;j<=a[0];j++)
{
temp=b[i]*a[j]+p[j+i-1];
p[j+i-1]=temp%ba;
p[j+i]=p[j+i]+temp/ba;
}
}
returnp;
}
}
//输出
voidoutput(unsignedshort*data)
{
unsignedinti;
for(i=data[0];data[i]==0;i--)//找到不为0的首位数
;
printf("%d",data[i]);
word
11/11
//输出最高位,假设有前导0如此不输出
i--;
//按顺序输出其他各位,有前导0也必须输出
for(;i>=1;i--)
{
printf("%04d",data[i]);
}
printf("n");
}
voidmain()
{
unsignedshortlen,reallen,*a,*b,*p;
char*str;
do//输入最大位数
{
printf("请输入单个数的最大位数(1--%d):",MAXLEN);
scanf("%d",&len);
}while((len<1)||(len>MAXLEN));
reallen=(len-1+WEISHU)/WEISHU;//计算实际组数,下面两行分配所需空间
a=(unsignedshort*)malloc((reallen+1)*sizeof(unsignedshort));
b=(unsignedshort*)malloc((reallen+1)*sizeof(unsignedshort));
str=(char*)malloc((len+1)*sizeof(char));
if((a==NULL)||(b==NULL)||str==NULL)
{
free(a);free(b);free(str);
printf("存分配不成功,无法继续进展操作!n");
}
el
{
input(str,a);
input(str,b);//输入被乘数与乘数
p=multiply(a,b);
output(p);//计算乘积并输出
}
}
本文发布于:2022-11-28 03:56:03,感谢您对本站的认可!
本文链接:http://www.wtabcd.cn/fanwen/fan/88/36776.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |