南阳OJ 题目64:小学生算术

题目信息:题目链接

小学生算术

时间限制: 3000 ms  |  内存限制: 65535 KB
难度: 1
描述
很多小学生在学习加法时,发现“进位”特别容易出错。你的任务是计算两个三位数在相加时需要多少次进位。你编制的程序应当可以连续处理多组数据,直到读到两个0(这是输入结束标记)。
输入
输入两个正整数m,n.(m,n,都是三位数)
输出
输出m,n,相加时需要进位多少次。
样例输入
123 456
555 555
123 594
0 0
样例输出
0
3 
1

解题思路:

输入:这一次的输入与以往不同,就是可以无限制的输入,但是当输入“0   0”的时候结束,这里可以用一个hashNext函数结束循环中的输入,也可以判断输入的内容:当检测是“0   0”的时候结束输入。在这里,每次读取输入的一行,将一行转化成字符串数组,再将这个数组转化成对应的数字数组(注意转化的方法:这里转化成了ASCII值,要变成相应的数字,要减去48,附一张ASCII表)
    输出:输出很好处理,就是判断进位的次数。
    功能:这个题要实现的是一个进位运算的功能,因此直接用两个数组保存输入的两个数字,对应的数位进行相加,数字大于10就进一位,进的位数要作用在相邻的更高的位数上(比如:十位上的数相加为s,s=12,则要进一位作用到百位上的数)。
    其中,在进位处理时,无论两个数多大,作用到相邻的位数的数字也是1(最大为9,两个9相加才18保留,1进位)
    具体的代码实现与相应部分的处理如代码所示:

代码实现:

import java.io.InputStreamReader;
import java.util.Scanner;

/*
 * Dragon
 * 2017/4/21
 * 小学生算术:http://acm.nyist.net/JudgeOnline/problem.php?pid=74&rec=rec
 * 使用charAt转化成对应的int值得时候,是相应的ascii码值,要转化成字符中的数字,要减去48
 */
public class Num_74 {

	public static void main(String[] args) 
	{
		Scanner in=new Scanner(System.in);
		int[] result=new int[100];
		int m=0;//用来数组result的下标处理
		String[] input=new String[2];
		
		input=in.nextLine().split(" ");
		while(!input[0].equals("0") && !input[1].equals("0"))
		{
			//a数组保存第一个数个,十,百的形式
			int[] a=new int[3];
			for(int i=2,j=0;i>=0;i--)
			{
				a[j]=input[0].charAt(i)-48;
				j++;
			}
			//相同处理数组b,保存第二个数
			int[] b=new int[3];
			for(int i=2,j=0;i>=0;i--)
			{
				b[j]=input[1].charAt(i)-48;
				j++;
			}
			
			//进位处理
			int carryBit=0,count=0;
			for(int i=0;i<3;i++)
			{
				int s=a[i]+b[i]+carryBit;
				if(s>9)
				{
					carryBit=1;count++;
				}
			}
			result[m]=count;
			m++;
			input=in.nextLine().split(" ");
		}
		
		//输出结果
		for(int i=0;i<m;i++)
			System.out.println(result[i]);
	}

}


运行结果:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这道题目的大致思路如下: 1. 首先读入原有文件中的数据,并将其保存到一个数组中; 2. 读入要插入的数据,并将其插入到数组中相应的位置; 3. 将数组中的数据写回到原有文件中。 下面是一个可能的实现: ```c++ #include <iostream> #include <fstream> #include <vector> using namespace std; struct Record { int id; string name; int age; }; int main() { // 读入原有文件中的数据 vector<Record> records; ifstream fin("data.txt"); if (fin.is_open()) { int id, age; string name; while (fin >> id >> name >> age) { records.push_back({id, name, age}); } fin.close(); } // 读入要插入的数据 Record new_record; cin >> new_record.id >> new_record.name >> new_record.age; // 将新数据插入到数组中相应的位置 int pos = -1; for (int i = 0; i < records.size(); ++i) { if (records[i].id > new_record.id) { pos = i; break; } } if (pos == -1) { records.push_back(new_record); } else { records.insert(records.begin() + pos, new_record); } // 将数组中的数据写回到原有文件中 ofstream fout("data.txt"); if (fout.is_open()) { for (const auto& record : records) { fout << record.id << " " << record.name << " " << record.age << "\n"; } fout.close(); } return 0; } ``` 其中,我们定义了一个 `Record` 结构体来表示每一条记录,然后使用一个 `vector` 来保存所有的记录。在读入原有文件中的数据,我们使用了文件读取流 `ifstream`,在写回到文件中,我们使用了文件写入流 `ofstream`。读入要插入的数据,我们直接使用标准输入流 `cin`。 在将新数据插入到数组中,我们首先需要找到相应的位置。这里我们使用了一种简单的方法,即遍历数组,找到第一个 ID 大于新数据 ID 的位置,然后将新数据插入到该位置。如果没有找到这样的位置,说明新数据 ID 是最大的,我们将其追加到数组末尾即可。在将新数据插入到数组中,我们使用了 `vector` 的 `insert` 方法。 最后,我们将数组中的数据写回到原有文件中。在写回到文件中,我们使用了 `ofstream` 的输出流运算符 `<<`。由于每条记录都需要以一行的形式写入文件,因此我们在输出时需要加上换行符 `\n`。 希望这个解答能够帮助到你!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值