描述
求2个浮点数相加的和
题目中输入输出中出现浮点数都有如下的形式:
P1P2...Pi.Q1Q2...Qj
对于整数部分,P1P2...Pi是一个非负整数
对于小数部分,Qj不等于0
关于输入
第1行是测试数据的组数n,每组测试数据占2行,分别是两个加数。每组测试数据之间有一个空行,每行数据不超过100个字符
关于输出
n行,每组测试数据有一行输出是相应的和。输出保证一定是一个小数部分不为0的浮点数
例子输入
2
0.111111111111111111111111111111
0.111111111111111111111111111111
10000000.655555555555555555555555555555
1.444444444444444444444444444445
例子输出
0.222222222222222222222222222222
10000002.1
#include<stdio.h>
#include <stdlib.h>
#include <string.h>
int main() {
int numberArr = 0;
scanf_s("%d", &numberArr);
char resArr[50][100];
for (int i = 0; i < numberArr; i++) {
char firstStr[100];
memset(firstStr, 0, 100);
char secendStr[100];
memset(secendStr, 0, 100);
char resStr[100];
memset(resStr, 0, 100);
char* buf;
scanf_s("%s", firstStr, 100);
scanf_s("%s", secendStr, 100);
char* str1f = strtok_s(firstStr, " ." ,&buf); //第一个数的整数部分
char* str1i = str1f;
if (str1f != NULL)
{
str1f = strtok_s(NULL, " .", &buf); //第一个数的小数部分
}
char* str2f = strtok_s(secendStr, " .", &buf); //第二个数的整数部分
char* str2i = str2f;
if (str2f != NULL)
{
str2f = strtok_s(NULL, " .", &buf); //第一个数的小数部分
}
int firstLen = strlen(str1f); //第一个数小数部分长度
int secendLen = strlen(str2f); //第二个数小数部分长度
int firstLenI = strlen(str1i); //第一个数小数部分长度
int secendLenI = strlen(str2i); //第二个数小数部分长度
if (firstLen > secendLen)
{
char resf[100];
char resi[100];
memset(resf, 0, 100);
memset(resi, 0, 100);
int carry = 0;
bool isLastE = true;
for (int j = (firstLen-1); j >= 0; j--)
{
if (j > (secendLen-1))
{
resf[j] = str1f[j];
}
else
{
//resf[j] = '0';
resf[j] = (char)(((int)str1f[j] + (int)str2f[j] + carry - 96) % 10) + 48;
carry = ((int)str1f[j] + (int)str2f[j] + carry - 96) / 10;
}
if (resf[j] != '0' && isLastE)
{
isLastE = false;
}
if (resf[j]=='0' && isLastE)
{
resf[j] = '\0';
}
}
int firstI = atoi(str1i);
int secendI = atoi(str2i);
sprintf_s(resi,"%d", (firstI + secendI+carry));
if (resf == NULL || resf[0] == '\0')
sprintf_s(resArr[i], 100, "%s", resi);
else
sprintf_s(resArr[i], 100, "%s.%s", resi, resf);
}
else
{
char resf[100];
char resi[100];
memset(resf, 0, 100);
memset(resi, 0, 100);
int carry = 0;
bool isLastE = true;
for (int j = (secendLen - 1); j >= 0; j--)
{
if (j > (firstLen - 1))
{
resf[j] = str1f[j];
}
else
{
//resf[j] = '0';
resf[j] = (char)(((int)str1f[j] + (int)str2f[j] + carry - 96) % 10) + 48;
carry = ((int)str1f[j] + (int)str2f[j] + carry - 96) / 10;
}
if (resf[j] != '0' && isLastE)
{
isLastE = false;
}
if (resf[j] == '0' && isLastE)
{
resf[j] = '\0';
}
}
int firstI = atoi(str1i);
int secendI = atoi(str2i);
sprintf_s(resi, "%d", (firstI + secendI + carry));
if (resf == NULL || resf[0] == '\0')
sprintf_s(resArr[i], 100, "%s", resi);
else
sprintf_s(resArr[i], 100, "%s.%s", resi, resf);
}
}
for (int i = 0; i < numberArr; i++)
{
printf("%s\n",resArr[i]);
}
return 0;
}
#include<stdio.h>
#include<string.h>
int main(){
char str1[150],str2[150];
while(gets(str1)){
gets(str2);
int len1=strlen(str1);
int len2=strlen(str2);
int apoint,bpoint;
for(int i=0;i<len1;i++){
if(str1[i]=='.'){
apoint=i;
break;
}
}
for(int i=0;i<len2;i++){
if(str2[i]=='.'){
bpoint=i;
break;
}
}
if(apoint>bpoint){// str2后移整数补0
int c=apoint-bpoint;
for(int i=len2-1;i>=0;i--){
str2[i+c]=str2[i];
}
for(int i=0;i<c;i++){
str2[i]='0';
}
len2=len2+c;
bpoint=apoint;
}
else{// str1后移整数补0
int c=bpoint-apoint;
for(int i=len1-1;i>=0;i--){
str1[i+c]=str1[i];
}
for(int i=0;i<c;i++){
str1[i]='0';
}
len1=len1+c;
apoint=bpoint;
}
if(len1>len2){// str2小数补0
for(int i=len2;i<len1;i++){
str2[i]='0';
len2=len1;
}
}
else{// str1小数补0
for(int i=len1;i<len2;i++){
str1[i]='0';
len1=len2;
}
}
int a[150],b[150];// b保存整数,a保存小数
int idx1,idx2,carry1,carry2;
idx1=idx2=carry1=carry2=0;
for(int i=len1-1;i>apoint;i--){
a[idx1++]=(str1[i]-'0'+str2[i]-'0'+carry1)%10;
carry1=(str1[i]-'0'+str2[i]-'0'+carry1)/10;
}
carry2=carry1+carry2;
for(int i=apoint-1;i>=0;i--){
b[idx2++]=(str1[i]-'0'+str2[i]-'0'+carry2)%10;
carry2=(str1[i]-'0'+str2[i]-'0'+carry2)/10;
}
if(carry2!=0){
b[idx2++]=carry2;
}
//b[]从后往前输出,在输出小数点,从后往前输出a[]//
for(int i=idx2-1;i>=0;i--){
printf("%d",b[i]);
}
printf(".");
for(int i=idx1-1;i>=0;i--){
printf("%d",a[i]);
}
printf("\n");
}
return 0;
}
可以参考以下高精度整数的运算,进行尝试解答此题!