zoukankan      html  css  js  c++  java
  • 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了好几次

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

    注定失败的战争,也要拼尽全力去打赢它; 就算输,也要输得足够漂亮。
  • 相关阅读:
    DS18B20读数错误排除
    一个自增计数的问题
    SQLServer2005删除log文件和清空日志的方案
    英语课件快要到期问题的解决
    msp430板子接485接口的气体传感器问题及处理
    修复Windows XP右键没有新建菜单问题
    linux和windows共享文件
    打开office word excel弹出visual studio 2008
    iar 问题
    Windows中 RabbitMQ安装与环境变量配置
  • 原文地址:https://www.cnblogs.com/yalphait/p/7898987.html
Copyright © 2011-2022 走看看