当前位置:首页 » 编程语言 » 自然数问题代码c语言
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

自然数问题代码c语言

发布时间: 2022-04-30 05:32:15

c语言问题 输入一个自然数 n 求n!,同时统计结果中有多少个0

不用开新问题了,我已经把原回答修改了,改成你要的字符串运算。

但即使这样,n也不要太大,看我测试数据就知道了。

代码原理:n!就是循环累计乘法,多位数字符串与多位数字符串相乘和人算法一样,就是其中一个字符串每一位数字和另一个字符串数字相乘,同时所有乘积移位累加。

注意:我写的所有字符串运算函数,没有写字符串验证,如果你想单独把函数拿出来用,记得写个输入验证,不要把非数字的字符串传进去。

#include<stdio.h>
#include<string.h>
#include<malloc.h>
#include<conio.h>
voidmeError(void*p);//内存申请失败
char*addByStr(char*str1,char*str2);
char*inversion(char*str);//倒置字符串
char*multByStr1(char*str1,charc2);//多位数字符串与单位数字符串相乘
char*multByStr2(char*str1,char*str2);//多位数字符串相乘
char*p10ByStr(char*str,intn);//字符串数字乘n个10
char*num2Str(intn);//数字转字符串
intmain()
{
intn,i,len,cnt=0;
char*nStr=NULL;
while(1)
{
nStr=(char*)malloc(sizeof(char)*2);
meError(nStr);
nStr[0]='1',nStr[1]=0;
printf("输入一个自然数n,求n! ");
scanf("%d",&n);
for(i=1;i<=n;i++)
nStr=multByStr2(nStr,num2Str(i));
printf("计算结果:%s ",nStr);
len=strlen(nStr);
for(i=len-1;i>=0;i--)
if(nStr[i]=='0')
cnt++;
printf("结果包含%d个0 ",cnt);
free(nStr);
nStr=NULL;
}
return0;
}
char*num2Str(intn)//数字转字符串
{
inti=0,len=1;
char*str=NULL,*strSave=NULL;
while(n)
{
if(str==NULL)
{
str=(char*)malloc(sizeof(char)*2);
meError(str);
}
else
{
strSave=(char*)realloc(str,sizeof(char)*(len+1));
meError(strSave);
str=strSave;
strSave=NULL;
}
str[i]=n%10+'0';
str[i+1]=0;
i++;
len++;
n=n/10;
}
inversion(str);
returnstr;
}
char*p10ByStr(char*str,intn)//字符串数字乘n个10,注意:str必须是动态申请内存!!
{
intlen=strlen(str),i;
char*p=NULL,*strSave=NULL;
if(n>0)
{
strSave=realloc(str,sizeof(char)*(len+1+n));
meError(strSave);
str=strSave;
p=&str[len];
for(i=0;i<n;i++)
*p='0',p++;
*p=0;
}
returnstr;
}
char*multByStr2(char*str1,char*str2)//多位数字符串相乘
{
intlen2=strlen(str2),i,j=0;
char**addStrs=(char**)malloc(sizeof(char*)*len2),*sum0=NULL,*sum1=NULL,*sum=NULL,c2;
meError(addStrs);
for(i=len2-1;i>=0;i--)
{
c2=str2[i];
addStrs[j++]=multByStr1(str1,c2);//这里addStrs存储的是str1和str2每一位的乘积
}
//--------sum0和sum1交替,为了及时释放内存-------
sum0=(char*)malloc(sizeof(char)*2);
meError(sum0);
sum0[0]='0',sum0[1]=0;;
for(i=0;i<len2;i++)
{
addStrs[i]=p10ByStr(addStrs[i],i);//在乘法运算中,最后累加要乘10
if(sum1==NULL)
{
sum1=addByStr(sum0,addStrs[i]);
free(sum0);
sum0=NULL;
}
else
{
sum0=addByStr(sum1,addStrs[i]);
free(sum1);
sum1=NULL;
}
free(addStrs[i]);
addStrs[i]=NULL;
}
if(sum0)
sum=sum0;
else
sum=sum1;
free(addStrs);
addStrs=NULL;
returnsum;
}
char*multByStr1(char*str1,charc2)//多位数字符串与单位数字符串相乘
{
intlen1=strlen(str1),i=len1-1,a,b,c=0;
char*mulStr=(char*)malloc(sizeof(char)*(len1+2)),*p=mulStr;
meError(mulStr);
memset(mulStr,0,sizeof(char)*(len1+2));
b=c2-'0';
while(1)
{
a=str1[i]-'0';
*p=((a*b)+c)%10+'0';
c=((a*b)+c)/10;
p++;
if(i==0)
{
if(c>0)
*p=c+'0';
break;
}
i--;
}
inversion(mulStr);
returnmulStr;
}
char*addByStr(char*str1,char*str2)
{
intlen1=strlen(str1),len2=strlen(str2),maxSize,i=len1-1,j=len2-1,a,b,c=0;
char*addStr=NULL,*p=NULL;
if(len1>len2)//多留两位,一位给结束符号,一位给进位
maxSize=len1+2;
else
maxSize=len2+2;
addStr=(char*)malloc(sizeof(char)*maxSize);
meError(addStr);
memset(addStr,0,sizeof(char)*maxSize);
p=addStr;
while(1)
{
if(i<0)
a=0;
else
a=str1[i]-'0';
if(j<0)
b=0;
else
b=str2[j]-'0';
*p=(a+b+c)%10+'0';//从后往前,每一位做加运算并保存余数和进位(数组中结果是反向存储的,最后再将数组倒置)
c=(a+b+c)/10;
p++;
if(i<=0&&j<=0)
{
if(c>0)
*p=c+'0';
break;
}
i--;
j--;
}
//--------------数组倒置------------------
inversion(addStr);
returnaddStr;
}
char*inversion(char*str)//倒置字符串
{
char*p=str,*pd=&str[strlen(str)-1],cs;
while(p<pd)
{
cs=*p;
*p=*pd;
*pd=cs;
p++;
pd--;
}
returnstr;
}
voidmeError(void*p)//内存申请失败
{
if(p==NULL)
{
printf(" 异常:内存申请失败!回车结束程序! ");
while(getch()!=' ');
exit(0);
}
}

❷ 求一个c语言自然数程序

//输出0~1000内所有完数及其因子//

#include<stdio.h>

void main()

{

int i,j,t,s,k;

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

{

t=i;

s=0;//保证每次循环开始时s的值都是0//

for(j=1;j<t;j++)

{

if(t%j==0)

{

s=s+j;

}

}

if(s==i)

{

printf("%d its factors are ",i);

printf("1");

for(k=2;k<s;k++)

{

if(s%k==0)

{

printf(",%d",k);

}

}

printf(" ");

}

}

}

❸ 急!!!怎么用C语言编写程序,用函数完成:计算从1开始到n的自然数的和

C语言是普适性最强的一种计算机程序编辑语言,它不仅可以发挥出高级编程语言的功用,还具有汇编语言的优点,计算和的方法为:

1、新建一个求1到100自然数之和项目。

注意事项:

C语言的语法限制不太严格,对变量的类型约束不严格,影响程序的安全性,对数组下标越界不作检查等。从应用的角度,C语言比其他高级语言较难掌握。也就是说,对用C语言的人,要求对程序设计更熟练一些。

❹ C语言 快速求一个自然数的约数的个数

对于这个问题我们只需要暴力从2到根号n这个闭区间的所有整数就行了,如果能整除计数就加2,不过如果这个整数的平方就是输入的n则计数只能加1。最后不要忘记1和其自身。如果根号n不是一个整数,那么我们可以向下取整。算法的整体复杂度是根号n,这个算法的时间消耗与根号n成正比,不过可以确定的是n在32位的整型(或者无符号的整型)数据范围内时间消耗还是比较乐观的。参考代码(C语言实现):
#include
<stdio.h>
#include
<math.h>
int
main(void)
{
int
i;
int
n;
int
m;
int
num;
scanf("%d",
&n);
num
=
0;
m
=
sqrt(n);
for
(i=2;
i<=m;
++i)
{
if
(n
%
i
==
0)
{
num
+=
2;
if
(i
*
i
==
n)
{
--num;
}
}
}
/*自然数1应该只有一个因子才对*/
if
(n
!=
1)
{
num
+=
2;
}
else
{
++num;
}
printf("%d\n",
num);
return
0;
}

❺ c语言 给定三个自然数数组(长度为1-100),求在三个数组中都存在的元素,-1表示三个数组没有公共元素

#include<stdio.h>
#include<malloc.h>
int main()
{
int *a,*b,*c;
int d[100];////////////////
for(int m=0;m<100;m++)/////
d[m]=-1;///////////////
int i,j,k,l,h,g,e,f,y,temp;

printf("输入问题数:");
scanf("%d",&l);
for(i=0;i<l;i++)
{
printf("输入三个数组的长度:");
scanf("%d%d%d",&g,&e,&f);y=0;

a= (int *) malloc(g* sizeof(int) );
b= (int *) malloc(e* sizeof(int) );////////
c= (int *) malloc(f* sizeof(int) );////////
//输入元素
printf("输入%d个元素:",g);
for(j=0;j<g;j++)
scanf("%d",&a[j]);
printf("输入%d个元素:",e);
for(k=0;k<e;k++)
scanf("%d",&b[k]);
printf("输入%d个元素:",f);
for(h=0;h<f;h++)
scanf("%d",&c[h]);
//查找相同元素并统计
printf("相同的元素为:");
for(j=0;j<g;j++)
for(k=0;k<e;k++)
for(h=0;h<f;h++)
if(a[j]==b[k]&&b[k]==c[h])
{
d[y]=a[j];
y++;

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

}
printf("y=%d\n",y);
//y--;
//排序
for(j=0;j<y;j++)//
{
k=j;
for(h=j+1;h<y;h++)
if(d[k]>d[h]) k=h;
if(j!=k)
{
temp=d[j];
d[j]=d[k];
d[k]=temp;
}
}
//输出结果
printf("case #%d:\n",i);
if(y!=0)
{
for(j=0;j<y;j++)////////////////
printf("%d ",d[j]);
}
//printf("%d\n",d[j]);
else
printf("-1\n");

}

return 0;
}

❻ 用c语言编写程序,判断两个自然数是否为“自然对数”,所谓自然对数,指两个自然数的和或差都是平方数例

#include<stdio.h>
main()
{
int i,j,A,B,s=0;
for(i=001;i<=14;i+=1)
for(j=i+2;j<=14;j+=2)
{ A=(j*j+i*i)/2;
if(A>100)continue;
B=j*j-A;
s+=i*i;
printf("%d,%d\t",A,B);/*输出自然数对*/
}
printf("sum=%d\n",s);/*输出自然数对之和509*/
getch();
}

❼ c语言的一个问题:怎样输出从1到100的自然数

#include
<stdio.h>
void
main()
{
int
i;
for(int
i=1;i<=100;i++)
{
printf("从1到100的自然数为:\n");
if(i%10==0)
{
printf("\n");//每10个数换行
}
printf("%d",i);
}
}

❽ c语言中任意自然数怎么表示

c语言中任意自然数表示:C语言中直接提供的是e为底的自然对数log,和以10为底的常用对数log10,其他对数写个函内数就可以。

在C语言中,没有针对实数的随机数函数。一般都是从rand演变。比如,要取一个0到100之间的实数,精度在6位小数,那么就先取一个,0~100000000之间的整型随机数,然后除以1000000.0,即rand()%100000000/1000000.0。

计算机单位

1和0是计算机处理数据的基本单位,你在电脑上看到的所有一切实际都是由1和0两个数组成的,每个1或0表示一个位,即一位比特(bit),8个比特是一个字节(B)。我们在电脑中看到的图像视频等都是计算机通过对储存器中无数个1和0的计算得来的。

❾ 用C语言编写在自然数中输出100以内的素数

#include<stdio.h>

//输出100之内的所有素数

int main()

{

int i;

int j;

int flag = 1;

for(i = 2;i <= 100;i++)

{

for(j = 2;j <= i / 2;j++)

{

if(i % j ==0)

{

flag = 0;

break;

}

}

if(flag == 1)

{

printf("%d ",i);

}

flag = 1;

}

return 0;

}

(9)自然数问题代码c语言扩展阅读

#include <stdio.h>

int main()

{

int a;

for (int i = 2; i < 100; i++)

{

int a = 0;

/* code */

for (int j = 2; j < i; j++)

{

/* code */

if (i % j == 0)

{

/* code */

a++;

}

}

if (a == 0)

{

/* code */

printf("%d is sushu ", i);

}

else

{

/* code */

printf("%d is not sushu ", i);

}

}

return 0;

}

❿ c语言,输入自然数,奇数从大到小排序,偶数从小到大,输出。

你是指数据还是代码本身,你代码能编译成功吗?代码本身有没有提示错误吗?我看你连一些基本库文件都没有加,而且还没有代码怎么退出输入状态,是要等所有的数组填满吗,有时候会不可能的!而且排序算法用错了。

这里修改了你一小部分代码:(退出输入状态是在最后的输入数字后面加上"\n"的\n才能退出)
代码如下:

#include <stdlib.h>
#include <stdio.h>
void main()
{
int a[100]={0},b[100]={0},c;
int i=0,j=0,t,n,m;
while (i>=0)
{
if(!scanf("%d",&c))
break;
else
{
if(c%2==0)
a[i++]=c;
else
b[j++]=c;
}
}
for(m=0;m<i;m++)
{
for (t=0;t<i-m-1;t++)
{
if(a[t]>a[t+1])
{
n=a[t];
a[t]=a[t+1];
a[t+1]=n;
}
}
}
for(m=0;m<i;m++)
printf("%d\t",a[m]);

for(m=0;m<j;m++)
{
for (t=0;t<j-m-1;t++)
if(b[t]<b[t+1])
{
n=b[t];
b[t]=b[t+1];
b[t+1]=n;
}
}
printf("\n");
for(m=0;m<j;m++)
printf("%d\t",b[m]);
system("pause");
}