17.11.26 字符串及字符数组练习选

1069 浮点数加法

描述
求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
 1 #include <iostream>
 2 #include<stdlib.h>
 3 #include<string>
 4 using namespace std;
 5 int main()
 6 {
 7     int point1, point2,point,len1,len2,len;
 8     int n;
 9     cin >> n;
10     for(int i=0;i<n;i++)
11     {
12         char ch1[100], ch2[100];
13         int num1[100] = { 0 }, num2[100] = { 0 }, num[200] = { 0 };
14         cin.ignore();
15         cin >> ch1;
16         cin.ignore();
17         cin >> ch2;
18         len1 = strlen(ch1);
19         len2 = strlen(ch2);
20         for(int j=0;ch1[j]!='.';j++)
21         {
22             num1[j] = ch1[j]-'0';
23             point1 = j+1;
24         }
25         for (int j = point1; ch1[j+1]!=''; j++)
26             num1[j] = ch1[j + 1]-'0';
27         for (int j = 0; ch2[j] != '.'; j++)
28         {
29             num2[j] = ch2[j] - '0';
30             point2 = j + 1;
31         }
32         for (int j = point2; ch2[j + 1]!=''; j++)
33             num2[j] = ch2[j + 1]-'0';
34         if(point1>=point2)
35         {
36             for (int j = point1 - point2 ; j <=point1-point2+len2-2; j++)
37                 num[j] = num2[j - point1 + point2 ];
38             len = len1-2 > point1 - point2 + len2-2 ? len1-2 : point1 - point2 + len2-2 ;
39             for(int j=0;j<=len;j++)
40             {
41                 num[len-j] += num1[len-j];
42                 if(num[len-j]>9)
43                 {
44                     num[len-j - 1]++;
45                     num[len-j] -= 10;
46                 }
47             }
48             for (int j = 0; j <= point1 - 1; j++)
49                 cout << num[j];
50             cout << ".";
51             int last;
52             for (int j = 199; num[j] == 0; j--)
53                 last = j - 1;
54             for (int j = point1; j <= last; j++)
55                 cout << num[j];
56             cout << endl;
57         }
58         else
59         {
60             for (int j = point2 - point1; j <= point2 - point1 + len1 - 2; j++)
61                 num[j] = num1[j - point2 + point1];
62             len = len2 - 2 > point2 - point1 + len1 - 2 ? len2 - 2 : point2 - point1 + len1 - 2;
63             for (int j = 0; j <= len; j++)
64             {
65                 num[len - j] += num2[len - j];
66                 if (num[len - j]>9)
67                 {
68                     num[len - j - 1]++;
69                     num[len - j] -= 10;
70                 }
71             }
72             for (int j = 0; j <= point2 - 1; j++)
73                 cout << num[j];
74             cout << ".";
75             int last;
76             for (int j = 199; num[j] == 0; j--)
77                 last = j - 1;
78             for (int j = point2; j <= last; j++)
79                 cout << num[j];
80             cout << endl;
81         }
82     }
83 }
View Code

习题(11-12) 计算2的N次方

描述
任意给定一个非负整数N(N<=100),计算2的N次方的值。

关于输入
输入只有一个非负整数N。

关于输出
输出2的N次方的值。

例子输入
5
例子输出
32
提示
高精度计算
 1 #include <iostream>
 2 #include<stdlib.h>
 3 #include<string>
 4 using namespace std;
 5 int main()
 6 {
 7     int mul[40] = { 0 };
 8     mul[39] = 1;
 9     int n;
10     cin >> n;
11     for (int i = 0; i<n; i++)
12     {
13         int peak;
14         for (int j = 1; mul[j] == 0; j++)
15             peak = j;
16         for (int j = peak; j <= 39; j++)
17         {
18             mul[j] *= 2;
19             if (mul[j] >= 10)
20             {
21                 mul[j - 1]++;
22                 mul[j] -= 10;
23             }
24         }
25     }
26     int flag = 0;
27     for (int i = 0; i <= 39; i++)
28     {
29         if (flag == 1)
30             cout << mul[i];
31         if (mul[i] != 0 && flag == 0)
32         {
33             flag = 1;
34             cout << mul[i];
35         }
36     }
37     cout << endl;
38 }
View Code

除以13

描述
输入一个大于0的大整数N,长度不超过100位,要求输出其除以13的整数除法得到的商和余数。

关于输入
一个大于0的大整数,长度不超过100。

关于输出
两行,分别为整数除法得到的商和余数。

例子输入
例子1

2132104848488485
例子2
10382942388594365769456845647694


例子输出
例子1

164008065268345
0
例子2
798687876045720443804372742130
4
提示
模拟除法运算,商的长度应该比输入大整数的长度少1或2。
 1 #include <iostream>
 2 #include<stdlib.h>
 3 #include<string>
 4 using namespace std;
 5 int main()
 6 {
 7     int quo[100] , num[100];
 8     for(int i=0;i<100;i++)
 9     {
10         quo[i] = -1;
11         num[i] = -1;
12     }
13     int remain = 0,flag=0;
14     char str[100];
15     cin >> str;
16     for (int i = 0; str[i] != ''; i++)
17         num[i] = str[i] - '0';
18     for(int i=0;str[i]!='';i++)
19     {
20         quo[i] = num[i] / 13;
21         remain = num[i] % 13;
22         if(str[i]!='')
23         num[i + 1] += remain * 10;
24     }
25     for(int i=0;quo[i]>=0;i++)
26     {
27         if (flag == 1)
28             cout << quo[i];
29         if (quo[i] != 0 && flag == 0)
30         {
31             flag = 1;
32             cout << quo[i];
33         }
34     }
35     if (flag == 0)
36         cout << "0";
37     cout << endl;
38     cout << remain << endl;
39 }
View Code

扩号匹配问题

描述
   在某个字符串(长度不超过100)中有左括号、右括号和大小写字母;规定(与常见的算术式子一样)任何一个左括号都从内到外与在它右边且距离最近的右括号匹配。写一个程序,找到无法匹配的左括号和右括号:首先输出原来字符串,下一行是和原字符串等长的一行,标出不能匹配的括号,其中不能匹配的左括号用"$"标注,不能匹配的右括号用"?"标注 

    

关于输入
第一行一个正整数n,表示数据的组数。后面n行,每组数据一行,包含一个字符串,只包含左右括号和大小写字母,字符串长度不超过100

关于输出
   对每组输出数据,输出两行,第一行包含原始输入字符,第二行由"$","?"和空格组成,与第一行等长,"$"和"?"表示与之对应的左括号和右括号不能匹配。 
   注意:即使所有括号都匹配,第二行也要输出等长的一行空格

例子输入
2

((ABCD(x)
)(rttyy())sss)(
例子输出
((ABCD(x)

$$      
)(rttyy())sss)(
?            ?$
 1 #include <iostream>
 2 #include<stdlib.h>
 3 #include<string>
 4 using namespace std;
 5 int main()
 6 {
 7     char str[105],str2[105];
 8     int n;
 9     cin >> n;
10     for(int i=0;i<n;i++)
11     {
12         cin >> str;
13         int len = strlen(str)-1;
14         for (int i = 0; i <=len; i++)
15             str2[i] = ' ';
16         int left=0, right=0;
17         for (int i = 0; i <= len; i++)
18         {
19             if (str[i] == '(')
20                 left++;
21             else if (str[i] == ')'&&left == 0)
22                 str2[i] = '?';
23             else if (str[i] == ')'&&left != 0)
24                 left--;
25         }
26         for (int i = len; i >=0; i--)
27         {
28             if (str[i] == ')')
29                 right++;
30             else if (str[i] == '('&&right == 0)
31                 str2[i] = '$';
32             else if (str[i] == '('&&right != 0)
33                 right--;
34         }
35         for(int i=0;i<=len;i++)
36             cout << str[i];
37         cout << endl;
38         for (int i = 0; i <= len; i++)
39             cout << str2[i];
40         cout << endl;
41     }
42 }
View Code

确定进制

描述
6*9 = 42 对于十进制来说是错误的,但是对于13进制来说是正确的。因为, 6(13) * 9(13) = 42(13), 而 42(13) = 4 * 13 + 2 = 54(10) 
你的任务是写一段程序读入三个整数p, q和 r,然后确定一个进制 B (2<=B<=16) 使得 p * q = r. 如果 B有很多选择, 输出最小的一个。例如:  p = 11, q = 11, r = 121. 则有 11(3) * 11(3) = 121(3) 因为 11(3) = 1 * 3 + 1 = 4(10) 和 121(3) = 1 * 3^2 + 2 * 3 + 1 = 16(10)。 对于进制 10,有 11(10) * 11(10) = 121(10)。这种情况下,应该输出 3。如果没有合适的进制,则输出 0。 

关于输入
输入有 T组测试样例。 T在第一行给出。每一组测试样例占一行,包含三个整数p, q, r。 p, q, r 的所有位都是数字,并且1<=p,q, r<=1,000,000

关于输出
对于每个测试样例输出一行。该行包含一个整数,即使得p * q = r成立的最小的B。如果没有合适的B,则输出 0。

例子输入
3

6 9 42
11 11 121
2 2 2
例子输出
13

3
0
 1 #include <iostream>
 2 #include<stdlib.h>
 3 #include<string>
 4 #include<math.h>
 5 using namespace std;
 6 int main()
 7 {
 8     int t, max=0;
 9     cin >> t;
10     for (int count= 0; count< t; count++)
11     {
12         max = 0;
13         char p[10], q[10], r[10];
14         int flag = 0;
15         cin >> p >> q >> r;
16         for (int i = 0; p[i] != ''; i++)
17         {
18             if (p[i] - '0' > max)
19                 max = p[i]-'0';
20         }
21         for (int i = 0; q[i] != ''; i++)
22         {
23             if (q[i] - '0' > max)
24                 max = q[i]-'0';
25         }
26         for (int i = 0; r[i] != ''; i++)
27         {
28             if (r[i] - '0' > max)
29                 max =r[i]-'0';
30         }
31         for (int j = max+1; j <= 16; j++)
32         {
33             int p1=0, q1=0, r1=0,p2=atoi(p),q2=atoi(q),r2=atoi(r);
34             for (int i = 0; p2 != 0; i++)
35             {
36                 p1 += p2 % 10 * pow(j, i);
37                 p2 /= 10;
38             }
39             for (int i = 0; q2 != 0; i++)
40             {
41                 q1 +=q2 % 10 * pow(j, i);
42                 q2 /= 10;
43             }
44             for (int i = 0; r2 != 0; i++)
45             {
46                 r1 += r2 % 10 * pow(j, i);
47                 r2 /= 10;
48             }
49             if (q1 * p1 == r1)
50             {
51                 cout << j << endl;
52                 flag = 1;
53                 break;
54             }
55         }
56         if (flag == 0)
57             cout << 0 << endl;
58     }
59 }
View Code

提取数字串按数值排序

描述
输入一串不超过300个字符的符号序列,请将其中的所有数字串提出,并将每个数字串作为整数看待(假设可以用int 表示),按从小到大顺序输出结果,输出的整数之间以逗号间隔。如果没有数字,则输出0;例如:*1234.345#6781ad9jk81-11101?aght88ir09kp,其中的整数包括:1234,345,6781,9,81,11101,88,9,从小到大排序后,应该输出: 
9,9,81,88,345,1234,6781,11101 

关于输入
在一行内输入一串符号

关于输出
从小到大排序的整数序列,如果没有数字,则输出0;

例子输入
*1234.345#6781ad9jk81-11101?aght88ir09kp
例子输出
9,9,81,88,345,1234,6781,11101
 1 #include <iostream>
 2 #include<stdlib.h>
 3 #include<string>
 4 using namespace std;
 5 int main()
 6 {
 7     char str[400];
 8     int flag=0,count=0;
 9     int num[200];
10     cin >> str;
11     for (int i = 0; str[i] != ''; i++)
12     {
13         if (flag == 0 && str[i] >= '0'&&str[i] <= '9')
14         {
15             count++;
16             num[count] = str[i] - '0';
17             flag = 1;
18             continue;
19         }
20         if (flag == 1 && str[i] >= '0'&&str[i] <= '9')
21         {
22             num[count] = num[count] * 10 + str[i] - '0';
23             continue;
24         }
25         if(flag==1&&( str[i] < '0'||str[i] > '9'))
26             flag = 0;
27     }
28     if (count == 0)
29         cout << "0" << endl;
30     else
31     {
32         for (int i = 1; i <= count - 1; i++)
33             for (int j = 1; j <= count - i; j++)
34             {
35                 int swap;
36                 if (num[j] > num[j + 1])
37                 {
38                     swap = num[j];
39                     num[j] = num[j + 1];
40                     num[j + 1] = swap;
41                 }
42             }
43         cout << num[1];
44         for (int i = 2; i <= count; i++)
45             cout << "," << num[i];
46         cout << endl;
47     }
48     return 0;
49 }
View Code

※有年代的病历单

描述
小英是药学专业大三的学生,暑假期间获得了去医院药房实习的机会。 
在药房实习期间,小英扎实的专业基础获得了医生的一致好评,得知小英在计算概论中取得过好成绩后,主任又额外交给她一项任务,解密抗战时期被加密过的一些伤员的名单。 
经过研究,小英发现了如下加密规律(括号中是例子) 
1.  原文中所有的字符都被循环左移了三个单位(dec  -> abz) 
2.  逆序存储(abcd -> dcba ) 
3.  大小写反转(abXY -> ABxy) 

关于输入
共n+1行 
第一行是名单中名字的个数n(1<=n <= 1000) 
随后是n行,每行是一个加密的字符串。(串长小于12)

关于输出
n行 
按照字典顺序输出解密后的字符串

例子输入
5
WDDFSSP
SDSDSDDo
SDKGGFSIa
LLLHFGFOl
GSOOWFASOq
例子输出
Dlvijjngv
Orijikooo
Rggvgvgv
Trvdizrrvj
svviggz
 1 #include <iostream>
 2 #include<stdlib.h>
 3 #include<string>
 4 using namespace std;
 5 int main()
 6 {
 7     char name[1500][15], after[1500][15];
 8     int n;
 9     cin >> n;
10     for (int i = 0; i < n; i++)
11     {
12         cin >> name[i];
13         int len;
14         for (int j = 0; name[i][j] != ''; j++)
15         {
16             name[i][j] += 3;
17             if (name[i][j] > 'z')
18                 name[i][j] -= 26;
19             if (name[i][j] > 'Z'&&name[i][j] < 'a')
20                 name[i][j] -= 26;
21             len = j;
22             if (name[i][j] >= 'a'&&name[i][j] <= 'z')
23                 name[i][j] += 'A' - 'a';
24             else
25                 name[i][j] += 'a' - 'A';
26         }
27         for (int j = len; j >= 0; j--)
28             after[i][len - j] = name[i][j];
29         after[i][len + 1] = '';
30     }
31     for (int i = 0; i<n - 1; i++)
32         for (int j = 0; j < n - i - 1;j++)
33         {
34             int len1, len2, flag = 0;
35             len1 = strlen(after[j]);
36             len2 = strlen(after[j + 1]);
37             for (int m = 0; m<=len1<len2?len1:len2;m++)
38             {
39                 if (after[j][m] > after[j + 1][m])
40                 {
41                     char swap[15];
42                     strcpy(swap, after[j]);
43                     strcpy(after[j], after[j + 1]);
44                     strcpy(after[j + 1], swap);
45                     flag = 1;
46                     break;
47                 }
48                 else if (after[j][m] == after[j + 1][m])
49                     continue;
50                 else if (after[j][m] < after[j + 1][m])
51                 {
52                     flag = 1;
53                     break;
54                 }
55             }
56             if (flag == 0 && len1>len2)
57             {
58                 char swap[15];
59                 strcpy(swap, after[j]);
60                 strcpy(after[j], after[j + 1]);
61                 strcpy(after[j + 1], swap);
62                 flag = 1;
63                 break;
64             }
65         }
66     for (int i = 0; i < n; i++)
67         cout << after[i] << endl;
68     return 0;
69 }
View Code

印象最深刻的一道题

WA了好几次

迷之字典顺序(还是第一次知道存在这样的排序方式)(遁)

注定失败的战争,也要拼尽全力去打赢它; 就算输,也要输得足够漂亮。
原文地址:https://www.cnblogs.com/yalphait/p/7898987.html