当前位置:首页 » 编程语言 » 超长c语言

超长c语言

发布时间: 2022-12-26 14:29:26

① 用c语言编程计算两个超长正整数(长度小于100)的加法

这是大数加法问题,我给你一个参考代码

输入至多100行的文本,每行是一个至多100位的十进制无符号大整数,最后的输入行为零。要求计算出这些大整数的和,并以十进制方式显示。

示例输入:
0

示例输出:#include <cstdio>
#include <cstring>
using namespace std;
int main()
{
const int n = 100;// 数字的最大位数
const int b = 10; // 数字的进制
char r[n+1] = {0};// 加数
char s[n+1] = {0};// 求和
while (scanf("%s", r) && strcmp(r, "0")) { // 对每一个加数...
for (int i = strlen(r)-1, j = n-1; i >= 0; i--, j--) { // 中的每一个数字位
r[i] -= '0'; // char -> int
for (int k = j, c = 0; 1; k--) { // update s
const int sum = (!c ? r[i] : 0) + s[k] + c; // local sum
if ((c = sum > b - 1)) s[k] = sum - b; // do update
else { s[k] = sum; break; } // end update
}
}
}
for (int i = 0; i < n; putchar(s[i++] + '0'));
return 0;
}

② C语言 超长整数加法

以前我也做过一个大整数程序,2000!,不过那里面没有减法。做这个减法真让花时间啊。
#include<stdio.h>
#include<string.h>
#include<math.h>
#define MAX 4000/*数位上限*/
dd(char *a)
{
char t[MAX];
int i,j;
for(i=0;i<MAX;i++)
{
if(a[i]==NULL)
{
for(j=0;i>0;j++,i--)
{
t[j]=a[i-1];
}
strncpy(a,t,j);
break;
}
}
}
add1(char *a,char *b,int n,char *c)
{
int N;
if(*a!=NULL&&*b!=NULL)
N=*a-'0'+*b-'0'+n;
else if(*a==NULL&&*b!=NULL)
N=*b-'0'+n;
else if(*a!=NULL&&*b==NULL)
N=*a-'0'+n;
else
N=n;
*c=(N%10)+'0';
N=N/10;
if(*(a+1)!=NULL||*(b+1)!=NULL||N!=0)
{
add1(a+1,b+1,N,c+1);
}
}
addab(char *a,char *b,char *c)
{
dd(a);
dd(b);
dd(c);
add1(a,b,0,c);
dd(a);
dd(b);
dd(c);
}
d_(char *a)
{
int i;
for(i=0;a[i]!=NULL;i++)
{
a[i]=a[i+1];
}
}
udg1(char *a,char *b,int n,char *c)
{
int N;
if(*b==NULL)
{
N=*a-'0'-n;
n=0;
}
else
{
if(*a>=(*b+n))
{
N=*a-*b-n;
n=0;
}
else
{
N=*a+10-*b-n;
n=1;
}
}
*c=N+'0';
if(*(a+1)!=NULL)
udg1(a+1,b+1,n,c+1);
}
udg(char *a,char *b,char *c)
{
int i;
if((strcmp(a,b)>0&&strlen(a)==strlen(b))||strlen(a)>strlen(b))
i=1;
else if((strcmp(a,b)<0&&strlen(a)==strlen(b))||strlen(b)>strlen(a))
i=-1;
else
i=0;
dd(a);
dd(b);
dd(c);
if(i==1)
udg1(a,b,0,c);
else if(i==-1)
{
udg1(b,a,0,c);
for(i=0;i<MAX;i++)
{
if(c[i]==NULL)
{
c[i]='-';
break;
}
}
}
else
*c='0';
dd(a);
dd(b);
dd(c);
}
add_(char *c)
{
int i;
char t1,t2;
t1=c[0];
t2=c[1];
c[0]='-';
for(i=1;t1!='\0';i++)
{
c[i]=t1;
t1=t2;
t2=c[i+1];
}
}
main()
{
char a[MAX]={NULL},b[MAX]={NULL},c[MAX]={NULL};
printf("输入两个数:\n");
scanf("%s",a);
getchar();
scanf("%s",b);
getchar();
if(a[0]!='-'&&b[0]!='-')
{
addab(a,b,c);
}
else
{
if(a[0]=='-'&&b[0]!='-')
{
d_(a);
udg(b,a,c);
}
else if(a[0]!='-'&&b[0]=='-')
{
d_(b);
udg(a,b,c);
}
else
{
d_(b);
d_(a);
addab(a,b,c);
add_(c);
}
}
printf("%s\n",c);
getchar();
}

③ C语言 输出超长的数

必须用数组a[MAXN]
最低位放在a[0]

④ C语言超长整数乘法计算问题

我想里面的
c[i+j] = a[i] * b[j] + c[i+j];
c[i+j+1] = c[i+j] / 10 + c[i+j+1];
c[i+j] = c[i+j] % 10;
应该是关于进位的,大于10 就要向前进一位
c[i+j] = a[i] * b[j] + c[i+j]; 比如这个等于 36 那么 把6 留下 3 进到 前一位去 ;
c[i+j+1] = c[i+j] / 10 + c[i+j+1]; 这句是向前进 十位 的 ;
c[i+j] = c[i+j] % 10; 这句就是 留下 各位 ;
这个不是跟乘法的思想是一样的嘛 每一位都要相乘嘛!
就行 55 * 55
不是需要 乘 4 遍嘛!

⑤ C语言处理超长字符串的问题,急急!!

我觉得这个可以用动态链表来储存,你想储存多少就分配多少的个该子节段的存储空间,比如
struct longchar {
char a;
struct longchar *next;
};

⑥ C语言超长整数相加

#include <stdio.h>#include <string.h>#define MAXLEN 1000void longadd(char* s1,char* s2 ,int* s3)
{ int arr1[MAXLEN]; int arr2[MAXLEN]; int arr3[MAXLEN]; int i; //求字符串长度倒序放在int 数组里面
int len1 = strlen(s1); for( i = 0; i < len1; i++)
{
arr1[i] = s1[len1-1-i] - '0';
} //求字符串长度倒序放在int 数组里面
int len2 = strlen(s2); for( i = 0; i < len2; i++)
{
arr2[i] = s2[len2-1-i] - '0';
} //加法运算
for( i = 0; i < MAXLEN; i++)
{
arr3[i] = arr1[i] + arr2[i];
} //数据处理超过9的进行取余并且进位
for( i = 0; i < MAXLEN; i++)
{ if(arr3[i] >= 10)
{
arr3[i+1] += arr3[i] / 10;
arr3[i] = arr3[i] % 10;
}
s3[i] = arr3[i];
} return;
}int main(int argc, char const *argv[])
{ char buff1[MAXLEN]; char buff2[MAXLEN]; int arr[MAXLEN]; puts("input 1:");
gets(buff1); puts("input 2:");
gets(buff2);

longadd(buff1,buff2,arr); //通过z变量的值过滤前面的0 倒序输出
int z = 0; for(int j =MAXLEN -1 ; j >= 0 ; j-- )
{ if(z == 0)
{ if(arr[j] != 0)
{ printf("%d",arr[j]);
z= 1;
}
} else
{ printf("%d",arr[j]);
}
} //如果z值没有改变则输出0
if( z== 0)
{ printf("0\n");
} return 0;
}

⑦ c语言:用字符串表示超长整数的运算

你可以用一个int数组来表示上百位的大数字。然后通过位操作来实现 +,-,*,/,%。用字符串来只会降低效率,而且也不规范。

⑧ 用c语言实现超长整数的加法运算

#include "stdio.h"
int sum(int a[],int b[],int c[])
{
int i=0,j=0,f=0;
for(;i<21;i++)
{
j=a[i]+b[i]+j;
if(j!=0) f=i;
c[i]=j%10000;
j=j/10000;
}
c[i]=j;
return f;
}
void get(int a[])
{
int n,i,j;
scanf("%d",&n);
j=(n-1)/4;
switch (n%4)
{
case 3:scanf("%3d",&a[j]);break;
case 2:scanf("%2d",&a[j]);break;
case 1:scanf("%1d",&a[j]);break;
case 0:scanf("%4d",&a[j]);break;
}

for(i=j-1;i>=0;i--)
scanf("%4d",&a[i]);
}
void main()
{
static int a[20],b[20],c[21],i,n,f;
char d[80];
get(a);
get(b);
f=sum(a,b,c);
for(i=f;i>=0;i--)
printf("%4d",c[i]);
}

⑨ c语言怎样用数组来运算超长的整数

特别长的像你那种,可使用
long long int(最长的整型变量了)
输出时用格式控制符%I64d // 是(i 的大写加64d,别写成L的小写了)
特别特别特别长的,long long int也装不下的,用字符数组处理,
那么如何加减乘除就要你花一番心思了

⑩ C语言 输出超长的数

用字符串呀。static char s[10000]; int i,j,t,L;
输入后,L = strlen(s); 然后对 一个一个字符作排队。
for (i=0;i<L-1;i++) for (j=i+1;j<L;j++) {
if (s[i]<s[j]) { t=s[i];s[i]=s[j];s[j]=t;};
处理完了打印出来 printf("%s",s);
}

热点内容
安卓网卡免驱动如何实现 发布:2024-05-18 15:25:15 浏览:859
8加6算法 发布:2024-05-18 15:04:25 浏览:737
名图16款尊享什么配置 发布:2024-05-18 14:55:37 浏览:584
我的世界怎样刷出32k服务器 发布:2024-05-18 14:32:32 浏览:565
c语言程序设计江宝钏 发布:2024-05-18 14:32:22 浏览:780
右击文件夹总是转圈圈 发布:2024-05-18 14:31:10 浏览:696
新建数据库phpmyadmin 发布:2024-05-18 14:22:38 浏览:736
安卓手机设备连接在哪里 发布:2024-05-18 14:08:28 浏览:820
路由器的密码最多是多少位 发布:2024-05-18 13:58:18 浏览:420
扫描服务器名称如何填 发布:2024-05-18 13:36:29 浏览:115