鱼C论坛

 找回密码
 立即注册
查看: 1058|回复: 6

[已解决]算法

[复制链接]
发表于 2020-12-12 11:33:32 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
#include<stdio.h>
#include<string.h>
#define MAX 1024
int main()
{
        int i=0,j=0,k=0,y=0,c=1,sum=1;
    char a[MAX];
        fgets(a,MAX,stdin);
        for(i=0;i<MAX;i++)
                if(a[i+1]=='\0')
                        break;
        for(j=0;j<i;j++)
        {
                c=1;
                for(y=j;y<i-1;y++)
                {
                        if((a[y]-a[y+1])&&a[0]!=a[y])   //这一行的判断条件,乱写的
                                c++;
                                sum=sum+c;
                       
                }
        }
        printf("%d",sum);
        return 0;
}



//说说我的想法,我是这样的比如输入ababc,先这样比较,ab,aba,abab,ababc,然后从b开始ba,bab.......一直到最后,哪个c++就是出现不同字符的时候加一。大佬们看看,哪个判断条件该如何写
最佳答案
2020-12-12 12:27:35
本帖最后由 jackz007 于 2020-12-12 12:32 编辑
#include <stdio.h>

int f(const char s[] , const int m)
{
        int d[26] = {0} , i , r                          ;
        for(i = 0 ; i < m ; i ++) d[s[i] - 'a'] ++       ;
        for(r = 0 , i = 0 ; i < 26 ; i ++) if(d[i]) r ++ ;
        return r                                         ;
}

int main(void)
{
        char c , s[256]                                                                        ;
        int i , j , m , sum                                                                    ;
        for(m = 0 ; (c = getchar()) && c >= 'a' && c <= 'z' ; s[m ++] = c , s[m] = '\0')       ;
        for(sum = i = 0 ; i < m ; i ++) for(j = i ; j < m ; j ++) sum += f(& s[i] , j - i + 1) ;
        printf("%d\n" , sum)                                                                   ;
}
        编译、运行实况
D:\00.Excise\C>cl x.c
用于 x86 的 Microsoft (R) C/C++ 优化编译器 19.28.29334 版
版权所有(C) Microsoft Corporation。保留所有权利。

x.c
Microsoft (R) Incremental Linker Version 14.28.29334.0
Copyright (C) Microsoft Corporation.  All rights reserved.

/out:x.exe
x.obj

D:\00.Excise\C>x
ababc
28

D:\00.Excise\C>
2020101816565222.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-12-12 12:27:35 | 显示全部楼层    本楼为最佳答案   
本帖最后由 jackz007 于 2020-12-12 12:32 编辑
#include <stdio.h>

int f(const char s[] , const int m)
{
        int d[26] = {0} , i , r                          ;
        for(i = 0 ; i < m ; i ++) d[s[i] - 'a'] ++       ;
        for(r = 0 , i = 0 ; i < 26 ; i ++) if(d[i]) r ++ ;
        return r                                         ;
}

int main(void)
{
        char c , s[256]                                                                        ;
        int i , j , m , sum                                                                    ;
        for(m = 0 ; (c = getchar()) && c >= 'a' && c <= 'z' ; s[m ++] = c , s[m] = '\0')       ;
        for(sum = i = 0 ; i < m ; i ++) for(j = i ; j < m ; j ++) sum += f(& s[i] , j - i + 1) ;
        printf("%d\n" , sum)                                                                   ;
}
        编译、运行实况
D:\00.Excise\C>cl x.c
用于 x86 的 Microsoft (R) C/C++ 优化编译器 19.28.29334 版
版权所有(C) Microsoft Corporation。保留所有权利。

x.c
Microsoft (R) Incremental Linker Version 14.28.29334.0
Copyright (C) Microsoft Corporation.  All rights reserved.

/out:x.exe
x.obj

D:\00.Excise\C>x
ababc
28

D:\00.Excise\C>
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-12-12 14:30:39 | 显示全部楼层

大佬给点注释,看不懂,还有ababc是正确的,28,但是我试了一下,我输入ab,不是应该是3吗,为什么答案是4
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-12-12 14:52:08 | 显示全部楼层
严凯 发表于 2020-12-12 14:30
大佬给点注释,看不懂,还有ababc是正确的,28,但是我试了一下,我输入ab,不是应该是3吗,为什么答案是 ...

       int f(char s[] , int m) 
        s 自然是 字符串,m 为需要从字符串中统计的字符个数。
        这个函数开辟了一个与 26 个小写字母相对应的整型数组 int d[26],用于统计每个字母出现的次数,在统计的时候,用 <字符编码> - 'a' 成为索引,这样从 'a' ~ 'z' 26 个字母对应于数值 0 ~ 25,例如,如果出现的字符是 'c' 那么,d['c' - 'a'] ++ ,就会使数组元素 d[2] 的值增加 1。最后统计的时候,数组 d 中不为 0 值的元素个数就是我们所需要的 f 值。
        ab 的值是 4 是正确的:
    a                     1
   ab                     2
    b                     1
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-12-12 15:29:44 | 显示全部楼层
jackz007 发表于 2020-12-12 14:52
s 自然是 字符串,m 为需要从字符串中统计的字符个数。
        这个函数开辟了一个与 26  ...

抱歉,抱歉,才睡醒,人都是懵的,1+2+1等于3都算出来了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-12-12 15:49:00 | 显示全部楼层
jackz007 发表于 2020-12-12 14:52
s 自然是 字符串,m 为需要从字符串中统计的字符个数。
        这个函数开辟了一个与 26  ...

大佬,哪个d[s[i] - 'a'] ++是上面意思,就是这个++,是值加一,还是加地址?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-12-12 16:25:36 | 显示全部楼层
严凯 发表于 2020-12-12 15:49
大佬,哪个d[s - 'a'] ++是上面意思,就是这个++,是值加一,还是加地址?

    是的,就是将对应于这个字符的数组元素的值加 1
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-12 10:03

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表