解题思路:
原字符串:210102
一共有 8 种不同的方案:
1)所选择的子串下标为 0 ∼ 1 ,反转后的 numnew = 120102 < 210102 ;
2)所选择的子串下标为 0 ∼ 2 ,反转后的 numnew = 012102 < 210102 ;
3)所选择的子串下标为 0 ∼ 3 ,反转后的 numnew = 101202 < 210102 ;
4)所选择的子串下标为 0 ∼ 4 ,反转后的 numnew = 010122 < 210102 ;
5)所选择的子串下标为 0 ∼ 5 ,反转后的 numnew = 201012 < 210102 ;
6)所选择的子串下标为 1 ∼ 2 ,反转后的 numnew = 201102 < 210102 ;
7)所选择的子串下标为 1 ∼ 4 ,反转后的 numnew = 201012 < 210102 ;
8)所选择的子串下标为 3 ∼ 4 ,反转后的 numnew = 210012 < 210102 ;
从方案中可以看出交换方法如下
1,所选字符串下标为0-1:交换下标为0和下标为1的字符串元素,此时只交换两个元素
2,所选字符串下标为0-2:交换下标为0和下标为2的字符串元素,此时只交换两个元素,下标为1的无法进行交换
3,所选字符串下标为0-3:交换下标为0和下标为3的字符串元素,交换下标为1和下标为2的元素
4,所选字符串下标为0-4:交换下标为0和下标为4的字符串元素,交换下标为1和下标为3的元素,下标为2的不交换
依次类推:....................
解题思路:
1,使用双重循环语句,第一次循环从字符串的第一个元素开始遍历整个字符串元素,第二个循环从第二个元素开始遍历整个数组
2,根据题意:交换后的字符串要比原字符串大小更小,则为交换有效,我们可以通过比较要进行交换的两个元素的大小,确定是否交换有效
参考代码:
#include<stdio.h>
#include<stdlib.h>
#define SIZE 5000 //最长字符串长度为5000
int main(void)
{
char arr[SIZE];
int sz = 0;
int number = 0;
scanf("%s", arr);
sz = strlen(arr);
for(int i=0;i<sz-1;i++)
{
for (int j = i + 1; j < sz; j++)
{
if (arr[i] > arr[j]) //比较要进行交换的两个元素的值的大小
{
number++;
}
else if (arr[i] == arr[j])
{
int temp1 = i;
int temp2 = j;
while (temp1<temp2)//如果要交换的两个元素相等,将前一个交换元素加1,后一个交换元素减1
{
temp1++;
temp2--;
if (arr[temp1] > arr[temp2])//比较要进行交换的两个元素的值的大小
{
number++;
break;
}
else if (arr[temp1] < arr[temp2])
{
break;
}
}
}
}
}
printf("%d", number);
return 0;
}
0.0分
14 人评分
else if (arr[i] == arr[j]) { int temp1 = i; int temp2 = j; while (temp1<temp2)//如果要交换的两个元素相等,将前一个交换元素加1,后一个交换元素减1 { temp1++; temp2--; if (arr[temp1] > arr[temp2])//比较要进行交换的两个元素的值的大小 { number++; break; } else if (arr[temp1] < arr[temp2]) { break; }为什么要加这个步骤。我怎么感觉重复计算了。有没有帮我解答的大佬啊
#include<stdio.h> #include<string.h> int main(){ char a[5000]=""; gets(a); int i=0,j,k=strlen(a),n=0,m; for(i=0;i<k;i++){ for(j=i+1;j<k;j++){ char b[j-i+1],c[j-i+1]; for(m=0;m<j-i+1;m++){ b[m]=a[i+m]; c[m]=a[j-m]; } if(strcmp(c,b)<0) n++; for(m=0;m<j-i+1;m++){ b[m]='0'; c[m]='0'; } } } printf("%d",n); return 0; } 这个哪里 错了捏
张皓博 2024-02-24 23:32:24 |
少了个库函数
C语言程序设计教程(第三版)课后习题7.4 (Java代码)浏览:873 |
2003年秋浙江省计算机等级考试二级C 编程题(2) (C语言代码)浏览:793 |
C语言程序设计教程(第三版)课后习题6.11 (C语言代码)浏览:2099 |
求组合数 (C语言代码)浏览:1207 |
C语言程序设计教程(第三版)课后习题6.5 (C语言代码)浏览:616 |
回文数字 (C语言代码)浏览:2539 |
C语言程序设计教程(第三版)课后习题10.2 (C语言代码)浏览:1483 |
Tom数 (C语言代码)浏览:517 |
1048题解(读入回车问题)浏览:628 |
C二级辅导-等差数列 (C语言代码)浏览:806 |
张皓博 2024-02-24 23:31:49 |
没重复啊,如果你当前选的子串最开始的数字和最后面的数字是相等的话,就要比里面长短更小的子串,就好比千位和个位相等了,你就要缩短长度比较里面的百位和十位