1~5题

1001. 害死人不偿命的(3n+1)猜想 (15)

水题 ,没什么好讲的,应该一遍过 。


1002. 写出这个数 (20)

  • 输入 :n的大小为10的100次,应该用数组去存它,因为long ,int,long long 都不够 ,而且这样比较方便计算每一位的总和,而且要用字
    符 数组。
    char input[100] ; scanf("%s",input) ;
    input前不用& ,因为它输入的是一个字符串 。

  • 计算 :
    输入的 数字是字符,应该把它转化为数字 ,并计算每一位的总和。
    for ( i = 0 ; input[i] != '\0' ; i++) sum += (int)(input[i] - 48 ) ;
    48指的是字符0的ASCII码
    算得在总和之后 ,应该读取每一位的数
    a[3] = {-1, -1,-1} ; // 用来存每一位数字,最多为三位,初始化为-1, 是为了判断数字最多为多少位 。 for ( j =0 ; sum > 0 ; j++ ) { a[j] = sum % 10 ; sum = sum / 10 ; }

  • 输出 :
    最后一个拼音之后没有空格 ,所以最后一个拼音要单独分出,是另一种情况。

     for(j=2; j>0; j--) { 
     switch (a[j]){
          case 0 : printf("ling ");  break ;
          case 1 : printf("yi ");    break ;
          case 2 : printf("er ");    break ;
          case 3 : printf("san ");   break ;
          case 4 : printf("si ");    break ;
          case 5 : printf("wu ");    break ;
          case 6 : printf("liu ");   break ;
          case 7 : printf("qi ");    break ;
          case 8 : printf("ba ");    break ;
          case 9 : printf("jiu ");   break ;
      }  }
         switch (a[0]){   // 输出最后一位拼音 
         case 0:printf("ling");  break;                     
         case 1 : printf("yi");    break ;                      
         case 2 : printf("er");    break ;                      
         case 3 : printf("san");   break ;                      
         case 4 : printf("si");    break ;                      
         case 5 : printf("wu");    break ;                      
         case 6 : printf("liu");   break ;                      
         case 7 : printf("qi");    break ;                      
         case 8 : printf("ba");    break ;                      
         case 9 : printf("jiu"); break ; 
    

1003. 我要通过!(20)

关键是要看懂题目的意思。

  1. 字符串中必须仅有P, A, T这三种字符,不可以包含其它字符;
  2. 任意形如 xPATx 的字符串都可以获得“答案正确”,其中 x 或者是空字符串,或者是仅由字母 A 组成的字符串;
  3. 如果 aPbTc 是正确的,那么 aPbATca 也是正确的,其中 a, b, c 均或者是空字符串,或者是仅由字母 A 组成的字符串。

首先,一定要看包括P,A,T三个字母,而且是以aPbATc 这样的形式,a,b,c 是由A组成的字符串或空字符串。
其次 ,由2可知,形如xPATx的字符串为正确,意思是PAT左右的字符串要相等,都为空字符串或同一长度的由A组成的字符串。
又有3可知 , P和T的中间每增加一个A,T的右边就会增加一个与P的左边一样的字符串 。 结合2 ,得出 T右边的A组成的字符串的长度是P左边的A组成的字符串长度的整数倍。
得出 ,在 aPbTc中 , 有c = ( b - 1 ) * a ,其中 a,b,c是字符串中A的个数 。


1004. 成绩排名 (20)

每个学生有成绩和学号,应该用结构体,每个学生和他的成绩和学号是整体。
学号和名字要存成字符数组,成绩要存成int型的。
先创建结构体。
struct Student { char name[10] ; char number[10] ; int score ; } ;
输入每个学生 ,每个学生的别名为p[i],存成一个数组,之后比较的时候会比较方便 。
scanf("%d",&n) ; // 学生人数 for ( i = 0 ; i < n ; i++){ struct Student p[i] ; scanf("%s",&p[i].name) ; scanf("%s",&p[i].number) ; scanf("%d",&p[i].score) ; }
比较成绩
for ( i = 0 ; i < n ; i ++){ for ( j = 0 ; j + i < n -1 ;j ++){ // 冒泡排序法 if ( p[j].score > p[j+1].score){ p[100] = p[j] ; // 利用p[100]作为中间变量,交换p[j]和p[j+1] p[j] = p[j+1] ; p[j+1] = p[100] ; } } }

讲真,我结构体不怎么会,这题是朱承浩写的。


1005. 继续(3n+1)猜想 (25)

这题用python写比较爽,用c语言的话,我比较无力。
n = input() b = raw_input() k = b.split() a = [int(i) for i in k] res = [int(i) for i in k] // 两个相同的,深拷贝 for c in a : while c != 1 : if c % 2 == 0 : c = c / 2 if c in a : // 不能是 if c in res ,即使res 和a 中的元素一样 res.remove(c) // 不能删除a中的c元素 else : pass else : c = (3*c+1)/2 if c in a : res.remove(c) else : pass res.sort(reverse = True) for i in res : print i,
不知道该怎么讲,自己感受一下吧 。

你可能感兴趣的:(1~5题)