一、
题目:
加法器
作者: frankhuhu
时间限制: 10s
章节: 字符串
问题描述
明明读小学的时候,不喜欢数学,尤其是不喜欢做加法,一做加法就头疼,这样导致明明长大后数学依然不好,而且对数字产生了抵触心理。可是不巧的是,明明进了一家会计公司,每天都要计算很多数据,在这些计算中加法运算居多,而且这些加法不只是是两个数之间的加法,更有多个数的连加。 例如:1+2+3的正确答案是6。 这给明明造成了很大的麻烦。你是明明的好朋友,看到明明如此痛苦,就产生了帮助明明的想法。你想帮明明写一个程序,这个程序能计算一串正整数的连加,从而帮助明明摆脱数字的困扰。 明明的问题可以归结为:给你一串正整数的连加表达式,完成这个表达式的计算。
输入说明
你写的程序要求从标准输入设备中读入测试数据作为你所写程序的输入数据。标准输入设备中有多组测试数据,每组测试数据仅有一行,每行有一个表达式,表达式由正整数和加号("+")组成,不含其他任何符号,表达式中的数字小于等于30000,表达式的长度不超过1000,具体格式见输入样例。每组测试数据与其后一组测试数据之间没有任何空行,第一组测试数据前面以及最后一组测试数据后面也都没有任何空行。
输出说明
对于每一组测试数据,你写的程序要求计算出一组相应的运算结果,并将每组运算结果作为你所写程序的输出数据依次写入到标准输出设备中。每组运算结果为一个整数,即表达式的值。每组运算结果单独形成一行数据,其行首和行尾都没有任何空格,每组运算结果与其后一组运算结果之间没有任何空行,第一组运算结果前面以及最后一组运算结果后面也都没有任何空行。 注:通常,显示屏为标准输出设备。
cpp
#include <bits/stdc++.h>
using namespace std;
int main() {
string s;
while(cin >> s)
{
string num[1000];
int k = 0;
for(char c : s)
{
if(c != '+')
{
num[k] += c; // 修改这里
}
else
{
k++;
}
}
int end = 0;
for(int i = 0; i <= k; i++)
{
int l = stoi(num[i]);
end += l;
}
cout << end << endl;
}
return 0;
}
总结:
头尾字符串匹配
二、
题目:
构造序列
作者: 孙辞海
时间限制: 10s
章节: 字符串
问题描述
序列是在数学世界中一种非常有趣的数字现象,它通过某一规则来产生数字,使数字变得有趣、变幻无穷。很多数学家对序列这种事物产生了浓厚的兴趣,花了很多时间对其进行研究,明明就是其中的一位。一天,他又在研究一种新的序列产生规则,该序列的规则如下:
1) 第1轮,写出两个1,即11;
2) 第2轮,在它们中间插入2,成为121;
3) 第3轮,在上面数中每两个相邻的和为3的数之间插入3,成为13231;
4) 以此类推下去,第n轮,在第n-1轮的数字的基础上,每两个相邻的和为n的数之间插入n。
明明根据这个规则开始构造序列。开始还觉得容易,但是越到后面,明明发现构造序列的计算量越来越大,计算难度也越来越高,计算速度也越来越慢。于是,明明就求助于你这位程序设计专家,能否帮他写一个程序,构造出序列的前9项,然后当明明需要知道序列中的哪一项的时,你就把那一项的数字告诉明明。
明明的问题可以归结为:根据题目描述中所描述的序列产生规则构造序列的前9项,然后告诉你一个正整数n,要求你输出序列的第n项。
输入说明
你写的程序要求从标准输入设备中读入测试数据作为你所写程序的输入数据。标准输入设备中有多组测试数据,每组测试数据仅占一行,每行仅包括一个正整数n(1≤n≤9),代表之后所要求的序列的第n项的值。每组测试数据与其后一组测试数据之间没有任何空行,第一组测试数据前面以及最后一组测试数据后面也都没有任何空行。
输出说明
对于每一组测试数据,你写的程序要求计算出一组相应的运算结果,并将这一组运算结果作为你所写程序的输出数据依次写入到标准输出设备中。每组运算结果为一个整数,即所要求的序列中那一项的数值,每组运算结果单独形成一行数据,其行首和行尾都没有任何空格,每组运算结果与其后一组运算结果之间没有任何空行,第一组运算结果前面以及最后一组运算结果后面也都没有任何空行。 注:通常,显示屏为标准输出设备。
cpp
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n;
while(cin>>n)
{
char s[100000]={'1','1'};
int len=2;
for(int i=2;i<=n;i++)
{
//int num=0;
for(int j=1;j<len;j++)
{
int a=s[j-1]-'0';
int b=s[j]-'0';
if((a+b)==i)
{
for(int k=len-1;k>=j;k--)
{
s[k+1]=s[k];
}
s[j]=i+'0';
len=len+1;
}
}
//len=len+num;
}
for(int i=0;i<len;i++)
{
cout<<s[i];
}
cout<<endl;
}
//总结:利用遍历字符串来匹配 插入时后移后面字符
}
总结:利用遍历字符串来匹配 插入时后移后面字符
三、
题目:
纯粹合数
作者: 朱凯
时间限制: 10s
章节: 字符串
问题描述
明明的爸爸是一位数学家,明明受他爸爸的影响从小就喜欢数学,经常向他爸爸学习或请教数学问题。
一天,明明问他爸爸什么是合数,明明的爸爸回答说:"首先,合数都是大于1的整数,其次合数是除了1和其本身外,还能被至少一个其他自然数整除的数,例如'4'这个数,它除了能被1和4整除外,还能被2整除,因此'4'就是合数;但是'3'就不是合数,因为3只能被1和3这两个数整除,因此'3'不是合数。"
聪明的明明很快就理解了他爸爸的意思,于是又接着问他爸爸:"那什么又是纯粹合数呢?"明明的爸爸接着回答说:"一个合数,去掉最高位,剩下的数是0或仍是合数;再去掉剩下的数的最高位,剩下的数还是0或合数;这样反复,一直到最后剩下的一位数仍为0或合数;我们把这样的数称为纯粹合数。
例如'100'这个数,它能被1、2、4、5、10、20、50、100整除,因此100是个合数,我们去掉它的最高位,剩下的数是0(其实剩下的应该是00,但是前置0对一个整数来说没有意义,因此前置0被舍去,就剩下个位数上的0),因此'100'是一个纯粹合数。有趣的是,100是最小的一个三位纯粹合数。
再例如'104'这个数,104能被1、2、8、13、26、52、104整除,所以104是个合数;我们去掉它的最高位后剩下4,4能被1、2、4整除,所以4也是合数,所以'104'是一个纯粹合数。
但是'101'就不是纯粹合数,因为'101'只能被1和101这两个数整除。"
明明对他爸爸的回答很满意,于是自己动手从100开始寻找纯粹合数,他一共找到了100个纯粹合数,调皮的明明开始反过来考爸爸了,问他爸爸能否告诉他第2个大于等于100的纯粹合数是哪个?第3个大于等于100的纯粹合数又是哪个?......明明的爸爸被这个突如其来的问题给难住了,他无法立刻回答出来,于是请求你的帮助,帮助他回答明明的这个问题。
明明的问题可以归结为:根据一个正整数n,求出从100开始从小到大的第n个纯粹合数。
输入说明
你写的程序需要从标准输入设备(通常为键盘)中读入多组测试数据,每组测试数据仅占一行,每行仅包括一个正整数n(1 ≤ n ≤ 100)。每组测试数据与其后一组测试数据之间没有任何空行,第一组测试数据前面以及最后一组测试数据后面也都没有任何空行。
输出说明
对于每一组测试数据,你写的程序需要计算出一组相应的运算结果,并将每组运算结果依次写入到标准输出设备(通常为启动该程序的文本终端,例如Windows中的命令行终端)中。每组运算结果为一个整数,即从100开始从小到大的第n个纯粹合数。每组运算结果单独形成一行数据,其行首和行尾都没有任何空格,每组运算结果与其后一组运算结果之间没有任何空行,第一组运算结果前面以及最后一组运算结果后面也都没有任何空行。
cpp
#include <bits/stdc++.h>
using namespace std;
int isHe(int a)
{
if(a <= 1) return 0;
for(int i = 2; i * i <= a; i++)
{
if(a % i == 0)
{
return 1; // 合数
}
}
return 0; // 不是合数
}
int main()
{
int n;
while(cin >> n)
{
int b = 100;
int k = 0;
while(true)
{
int a = b;
int flag = 1;
while(a != 0)
{
if(!isHe(a)) // 不是合数
{
flag = 0;
break;
}
string s = to_string(a);
if(s.length() == 1)
{
a = 0;
}
else
{
a = stoi(s.substr(1));
}
}
if(flag)
{
k++;
}
if(k == n)
{
cout << b << endl;
break;
}
b++;
}
}
return 0;
}
总结:
函数判断合数 循环逐个判断
四、
Independently of this, in the United States, a prototype electronicmachine had been built as early as 1939, by John Atanasoff[插图] and CliffordBerry[插图] at Iowa State College[插图]. This prototype and later research werecompleted quietly and later overshadowed by the development of theElectronic Numerical Integrator And Computer (ENIAC[插图]) in 1945. ENIAC was granted a patent, which was overturned decades later, in 1973, whenthe machine was revealed to have incorporated principles first used in theAtanasoff-Berry Computer.
此外,早在 1939 年,美国爱荷华州立大学的约翰·阿塔纳索夫和克利福德·贝里就已经制造出了一台电子计算机的原型机。这台原型机以及后来的研究都是在悄无声息中完成的,后来在 1945 年,电子数字积分器与计算机(ENIAC)的研制成功使其黯然失色。ENIAC 获得了专利,但几十年后,在 1973 年,当人们发现这台机器采用了阿塔纳索夫-贝瑞计算机的原理时,ENIAC 的专利被推翻。
ENIAC (see Figure 1A-1) contained 18,000 vacuum tubes and had a speedof several hundred multiplications per minute, but originally its programwas wired into the processor[插图] and had to be manually altered. Latermachines were built with program storage, based on the ideas of theHungarian-American mathematician John von Neumann[插图]. Theinstructions, like the data, were stored within a "memory", freeing thecomputer from the speed limitations of the paper-tape reader duringexecution and permitting problems to be solved without rewiring thecomputer.
ENIAC(见图1A-1)包含18,000个真空管,每分钟可以进行数百次乘法运算,但最初它的程序是连接到处理器上的,必须手动更改。后来,基于匈牙利裔美国数学家约翰·冯·诺依曼的想法,建造了具有程序存储功能的机器。指令与数据一样,都存储在"内存"中,使计算机在执行时不受纸带阅读器的速度限制,并允许在不重新连线计算机的情况下解决问题。
The use of the transistor in computers in the late 1950s marked theadvent of smaller, faster, and more versatile logical elements than werepossible with vacuum-tube machines. Because transistors use much lesspower and have a much longer life, this development alone wasresponsible for the improved machines called second-generationcomputers. Components became smaller, as did inter-componentspacings, and the system became much less expensive to build.
20 世纪 50 年代末,晶体管在计算机中的使用标志着比真空管机器更小、更快、更灵活的逻辑元件的出现。由于晶体管使用的功率少得多,寿命也长得多,这一发展本身就导致了被称为第二代计算机的改进机器。元件变得更小,元件之间的距离也变得更小,系统的建造成本也大大降低。
