• 循环分支、字符串习题(水仙花数、字符串左旋)


    目录

    1. 求前n项a的和

    2. 打印出1-1000之间所有的水仙花数

    3. 使得数组内奇数全部位于偶数前面

    4. 智力题:喝汽水问题

    5. 智力题:找凶手问题

    6. 字符串左旋

    7. 判断一个字符串是否为另外一个字符串旋转之后的字符串


    1. 求前n项a的和

    如:2+22+222+2222+22222

    1. int a = 2; int n = 2;
    2. int sum = 0;
    3. int i = 0;
    4. int j = 0;
    5. for(i=1; i<=n; i++)
    6. {
    7. int ret = 0;
    8. for(j=0; j<i; j++)
    9. {
    10. ret += a * (pow(10,j));//注意:次方的书写格式;
    11. }
    12. sum += ret;
    13. }
    14. printf("sum is %d\n",sum);
    15. //解法二:以上可以简化,222 = 2+22*10
    16. int a = 2; int n = 2;
    17. int sum = 0;
    18. int i = 0;
    19. int ret = 0;
    20. for(i=1; i<=n; i++)
    21. {
    22. ret = a + ret *10;//ret用来保存中间数;
    23. sum += ret;
    24. }
    25. printf("sum is %d\n",sum);

    2. 打印出1-1000之间所有的水仙花数

    水仙花数(Narcissistic number)也被称为超完全数字不变数(pluperfect digital invariant, PPDI)、自恋数、自幂数、阿姆斯壮数或阿姆斯特朗数(Armstrong number),水仙花数是指一个 3 位数,它的每个位上的数字的 3次幂之和等于它本身。例如:1^3 + 5^3+ 3^3 = 153。

    1. int Is_n(int i){
    2. int a = 0;
    3. while(i != 0){
    4. i = i/10;
    5. a++;
    6. }
    7. return a;}
    8. //先判断这是几位数;再判断n次幂之和是否等于这个数;
    9. int main(){
    10. int i = 0;
    11. int n = 0;
    12. for(i = 1; i<=1000; i++){
    13. int tmp = i;
    14. int sum = 0;
    15. n = Is_n(i);//判断是几位数;
    16. while(tmp != 0){
    17. sum += pow(tmp%10,n);
    18. //i = i/10;//i的值会变,创建一个临时变量tmp
    19. tmp = tmp/10;
    20. }
    21. if( sum == i){
    22. printf("%d ",i);
    23. }// end if
    24. }// end for
    25. }

    3. 使得数组内奇数全部位于偶数前面

    冒泡排序的思想

    1. int Is_odd_even(int i)
    2. {
    3. if(i%2 == 0)
    4. return 0;//偶数返回0
    5. else
    6. return 1;//奇数返回1
    7. }
    8. int arr[] = {1, 2 ,3, 4, 5, 6, 7, 8};
    9. int i = 0;
    10. int sz = sizeof(arr)/sizeof(arr[0]);
    11. for(i=0; i<sz-1; i++)//冒泡排序的思想;
    12. {
    13. int j = 0;
    14. for(j = i; j<sz-1; j++)
    15. {
    16. if(Is_odd_even(arr[j])<Is_odd_even(arr[j+1]))//偶数位0,奇数为1
    17. {
    18. int tmp = arr[j];
    19. arr[j] = arr[j+1];
    20. arr[j+1] = tmp;
    21. }
    22. }
    23. }
    24. for(i = 0; i<sz; i++)
    25. printf("%d ",arr[i]);

    4. 智力题:喝汽水问题

    一瓶一元,两个空瓶可以换一瓶汽水,20元可以喝多少瓶

    1. int money = 20;
    2. //第一次买回来的水
    3. int total = money;
    4. int empty = money;
    5. //换回来的水
    6. while(empty/2)
    7. {
    8. total += empty/2;
    9. empty = empty/2 + empty%2;
    10. }
    11. printf("%d\n",total);

    5. 智力题:找凶手问题

        a说:不是我;
        b说:是c
        c说:是d
        d说:c说的不对
        以上3句真话,1句假话
        以上四个语句产生0或者1,依次假设凶手,加起来等于3则满足题意

    1. char killer = 0;
    2. for (killer = 'A'; killer <= 'D'; killer++)
    3. {
    4. if ( (killer != 'A')
    5. + (killer == 'C')
    6. + (killer == 'D')
    7. + (killer != 'D')
    8. == 3 )
    9. {
    10. printf("killer is %c\n", killer);
    11. }
    12. }

    智力题训练:可参考牛客网-专项训练-智力题
    赛马问题、烧香问题等

    6. 字符串左旋

    实现一个函数,可以左旋字符串中的k个字符。
    例如:ABCD左旋一个字符得到BCDA;ABCD左旋两个字符得到CDAB

    (1)暴力求解法

    1. void Left_rotate(char arr[])//左旋一次
    2. {
    3. int sz = strlen(arr);
    4. char tmp = arr[0];
    5. int j = 0;
    6. for(j = 0; j<sz-1; j++)
    7. {
    8. arr[j] = arr[j+1];
    9. }
    10. arr[sz-1] = tmp;
    11. }
    12. void Right_rotate(char arr[])//右旋一次
    13. {
    14. int sz = strlen(arr);
    15. char tmp = arr[sz-1];
    16. int j = 0;
    17. for(j = sz-1; j>0; j--)
    18. {
    19. arr[j] = arr[j-1];
    20. }
    21. arr[0] = tmp;
    22. }
    23. void Reverse_L_R(char arr[], void(*p)(char[]), int n)//左旋n次
    24. {
    25. int i = 0;
    26. for(i = 0; i<n; i++)
    27. {
    28. (*p)(arr);
    29. }
    30. }
    31. char arr[] = "abcd";
    32. int n = 2;
    33. void(*p)(char arr[]) = &Left_rotate;
    34. Reverse_L_R(arr, p, n);//回调函数
    35. printf("%s ",arr);

    (2)三步反转法

    1. void string_left_rotate(char* str, int k)
    2. {
    3. int n = strlen(str);
    4. assert(str);
    5. //三次逆序后达到左旋的效果;
    6. reverse(str, str+k-1);//逆序左边
    7. reverse(str+k, str+n-1);//逆序右边
    8. reverse(str, str+n-1);//逆序整体
    9. }
    10. char arr[] = "abcd";
    11. int n = 2;
    12. string_left_rotate(arr, n);
    13. printf("%s ",arr);

    7. 判断一个字符串是否为另外一个字符串旋转之后的字符串

    例如:给定s1 = AABCD和s2 = BCDAA,返回yes
    给定s1 = abcd和s2 = ACBD,返回no

    (1)穷举法

    1. char arr1[] = "abcde";
    2. char arr2[] = "bcdea";
    3. int i = 0; int sz = strlen(arr1);
    4. for(i=0; i<=sz; i++)
    5. {
    6. //可以利用上一题的左旋函数
    7. //string_left_rotate(arr2, i);//这里不能用i,每次旋转之后arr2都变了
    8. string_left_rotate(arr2, 1);//用1就行,在上一次旋转的基础上旋转
    9. if(strcmp(arr2, arr1)==0){
    10. printf("yes\n");
    11. break;}
    12. }
    13. if(i > sz)
    14. printf("no\n");

    (2)如果是旋转串,那么arr2肯定是arr1+arr1的子串

    1. char arr1[30] = "abcde";
    2. char arr2[30] = "bcdea";//前提要保证两个字符串长度相等
    3. int sz = strlen(arr1);
    4. char * ret;
    5. //1. arr1字符串的后边追加一个arr1
    6. //strcat(arr1, arr2);//在arr1后面arr2
    7. //printf("%s ",arr1);
    8. strncat(arr1,arr1, sz);//该函数用于追加相同的字符串
    9. //2. 判断arr2是否为追加后arr1的子串
    10. ret = strstr(arr1, arr2);//该函数用于判断arr2是否为arr1的子串,是则返回子串起始字符地址,不是则返回NULL
    11. if(ret == NULL)
    12. printf("no\n");
    13. else
    14. printf("yes\n");
  • 相关阅读:
    NLP(2)--Transformer
    【.Net Core】程序相关各种全局文件
    网络编程Netty的使用
    项目经理必备思维之整合思维
    厉害了,腾讯内部都用的Spring+MyBatis源码手册,实战理论两不误
    使用Spring Boot整合定时任务(Schedule)
    【pyhon】利用pygame实现彩图版飞机大战(附源码 可供大作业练习使用)
    【framework-5】可能你需要加个if、加了变量
    通过U盘重装Win10教程图解
    如何运行github上的项目
  • 原文地址:https://blog.csdn.net/m0_60416282/article/details/125511938