要求如下
}
后续不知道怎么写
我希望的是一个被引用函数用来实现大数相加,一个用来实现大数相乘。
求解答!
代码如下:
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
#define MAXNUM (int)300
//去除字符串前面的0
void movePreZero(char c[])
{
int i;
while (c[0] == '0')
{
for (i = 0; i < strlen(c) - 1; i++)
c[i] = c[i + 1];
c[strlen(c) - 1] = 0;
}
}
//显示字符串
void print(char c[])
{
int i = 0;
int flag = 0;
for (i = 0; c[i] != '\0'; i++)
{
if (c[i] != '0')
flag = 1;
if (flag)
printf("%c", c[i]);
else
printf(" ");
}
printf("\n");
}
//大数相加 c = a + b
void bigAdd(char a[], char b[], char c[])
{
int i = 0;
int shift = 0, val;
int l1 = strlen(a);
int l2 = strlen(b);
int len = l1 > l2 ? l1 : l2;
len += 1; //多留一个进位
c[len] = 0; //后一个位置为0
//从后往前迭代
l1--;
l2--;
len--;
while (l1 >= 0 && l2 >= 0)
{
int t = (a[l1] - '0') + (b[l2] - '0') + shift;
if (t >= 10)
{
shift = 1;
t -= 10;
c[len] = '0' + t;
}
else
{
shift = 0;
c[len] = '0' + t;
}
len--;
l1--;
l2--;
}
//a
while (l1 >= 0)
{
int t = (a[l1] - '0') + shift;
if (t >= 10)
{
shift = 1;
t -= 10;
c[len] = '0' + t;
}
else
{
shift = 0;
c[len] = '0' + t;
}
len--;
l1--;
}
//b
while (l2 >= 0)
{
int t = (b[l2] - '0') + shift;
if (t >= 10)
{
shift = 1;
t -= 10;
c[len] = '0' + t;
}
else
{
shift = 0;
c[len] = '0' + t;
}
len--;
l2--;
}
if (shift != 0)
c[0] = '0' + shift;
else
c[0] = '0';
movePreZero(c);
}
//大数相乘 c = a * b
void bigMul(char a[], char b[], char c[])
{
int i, j, t, k, val;
int maxlen;
int shift = 0;
int l1 = strlen(a);
int l2 = strlen(b);
char tmp[MAXNUM] = { 0 };
//结果最多是l1+l2位数
maxlen = l1 + l2;
c[maxlen] = 0; //字符串正常结束
for (i = 0; i < maxlen; i++)
c[i] = '0';
if (l1 < l2)
{
//交换a和b
strcpy(tmp, a);
strcpy(a, b);
strcpy(b, tmp);
t = l1;
l1 = l2;
l2 = t;
}
for (t = 0, i = l2 - 1; i >= 0; i--, t++) //遍历b,乘以a的所有数
{
shift = 0;
memset(tmp, '0', maxlen);
tmp[maxlen] = 0;
for (k = 0, j = l1 - 1; j >= 0; j--, k++)
{
val = (b[i] - '0') * (a[j] - '0') + shift;
if (val >= 10)
{
shift = val / 10;
val = val % 10;
}
else
shift = 0;
tmp[maxlen - 1 - t - k] = '0' + val;
}
if (shift)
tmp[maxlen - 1 - t - k] = '0' + shift;
//print(tmp);
shift = 0;
//计算c与tmp的和
for (k = maxlen - 1; k >= 0; k--)
{
if (tmp[k] == 0)
continue;
else
{
val = c[k] - '0' + tmp[k] - '0' + shift;
if (val >= 10)
{
shift = val / 10;
val = val % 10;
}
else
shift = 0;
c[k] = '0' + val;
}
}
}
movePreZero(c);
}
int main()
{
int n, m;
char a[MAXNUM] = { 0 }, b[MAXNUM] = { 0 }, c[MAXNUM] = { 0 }, d[MAXNUM] = { 0 };
scanf("%s %s", a, b);
bigAdd(a, b, c);
bigMul(a, b, d);
printf("和:");
print(c);
printf("积:");
print(d);
return 0;
}
先把字符串拆分出来,变成字符串数组,然后字符串转int,对字符串数组进行操
不能直接字符串转int吗? 如有帮助望采纳
atoi 是把字符串转换成int型的一个c语言函数,很方便的进行使用。
其函数参数是一个字符串,如果第一个非空格字符存在,是数字或者正负号则开始做类型转换,之后检测到非数字(包括结束符 \0) 字符时停止转换,返回整型数。否则,返回零。
int main(void)
{
int n;
char* str = "23.5";
n = atoi(str);
printf("string=%s,n=%d\n",str,n);
return0;
}
可以参考我之前的这个回答
https://ask.csdn.net/questions/7715333?answer=53787379
public static void main(String[] args) {
String a = "75";
String b = "75";
while((a.length() - b.length()) != 0){
if(a.length() > b.length()) {
b = "0" + b;
} else {
a = "0" + a;
}
}
StringBuilder sb = new StringBuilder();
int flag = 0;
for(int i = a.length() - 1; i >= 0; i--) {
int s = Integer.parseInt(String.valueOf(a.charAt(i))) + Integer.parseInt(String.valueOf(b.charAt(i))) + flag;
if(s > 9) {
flag = s / 10;
s = s % 10;
} else {
flag = 0;
}
sb.append(s);
}
if(flag > 0) {
sb.append(flag);
}
System.out.println(sb.reverse().toString());
}
仅供参考