| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 4108 人关注过本帖, 1 人收藏
标题:关于n的倍数,有没有高效的方法?
只看楼主 加入收藏
搬砖
Rank: 2
等 级:论坛游民
帖 子:68
专家分:37
注 册:2016-10-13
结帖率:90%
收藏(1)
已结贴  问题点数:20 回复次数:44 
关于n的倍数,有没有高效的方法?
描述
一个长度为N的数组A,从A中选出若干个连续的数,使得这些数的和是N的倍数。
例如:N = 8,数组A包括:2 5 6 3 18 7 11 19,可以选2 5 6 3,因为2 + 5 + 6 + 3 = 16,是8的倍数。

输入格式
(单case)
第1行:1个数N,N为数组的长度,同时也是要求的倍数。(2 <= N <= 10000)
第2行:N个数,表示数组A的元素。(0 < A[i] <= 10^9)
输出格式
如果没有符合条件的,输出No Solution。
如果有
第1行:1个数S表示你所选择的数的数量。
第2行:1个数i表示你选择的第一个数的下标(下标从1开始)。
(如果有多个答案,优先选择开始下标最小的,还是有多个答案时,再优先选择数的数量最少的一个)
输入样例
8
2 5 6 3 18 7 11 19
输出样例
4
1
搜索更多相关主题的帖子: 元素 
2016-12-22 19:06
搬砖
Rank: 2
等 级:论坛游民
帖 子:68
专家分:37
注 册:2016-10-13
收藏
得分:0 
回复 5楼 九转星河
好强,不过我有些地方不懂,我先自己探究一下,不懂再向你请教
2016-12-22 22:58
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
回复 6楼 搬砖
刚才没看清题目,难怪这么难~为了不影响,把上面的水贴给删了~

[此贴子已经被作者于2016-12-22 23:25编辑过]


[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2016-12-22 23:13
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:2 
回复 5楼 搬砖
上面的不要看了,看这个~
倍数表示取余=0便是了~
程序代码:
#include<stdio.h>
int main()
{
    int a[]={1,2,3,4,5,6,7,8,9,10};
    int goal=20;
    int n=sizeof(a)/sizeof(int);

    int i=0;
    int j=0;
    int sum=0;
    int flag=0;

    for (i=0;i<n&&flag==0;i++,sum=0)
        for (j=i;j<n;j++)
        {
            sum+=a[j];
            if (sum%goal==0)
            {
                printf("%d\n%d\n",i+1,j+1-i);
                flag=1;
                break;
            }
        }

    if (flag==0)
        printf("No Solution!\n");
    return 0;

}

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2016-12-22 23:23
吹水佬
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:451
帖 子:10607
专家分:43186
注 册:2014-5-20
收藏
得分:0 

图片附件: 游客没有浏览图片的权限,请 登录注册


#include <stdio.h>
#include <stdlib.h>

void _swap(char *c1, char *c2)
{
    *c1 ^= *c2;
    *c2 ^= *c1;
    *c1 ^= *c2;
}

void _print(int *a, char *c, int n, int mul)
{
    int i, sum=0;
    for (i=0; i<n; i++)
        if (c[i] == 1)
            sum += a[i];
    if (sum%mul==0)
    {
        for (i=0; i<n; i++)
            if (c[i] == 1)
                printf("%d + ", a[i]);
        printf("\b\b \b");   
        printf("= %d   (%d*%d)\n", sum, sum/mul, n);   
    }
}

void _combine(int *a, int n, int m, int mul)
{
    int i, j, k;
    char *c=(char *)calloc(n, sizeof(char));
    for (i=0; i<m; i++)
        c[i] = 1;
    while (1)
    {
        _print(a, c, n, mul);
        for (i=0; i<n-1; i++)
            if (c[i]==1 && c[i+1]==0)
                break;
        if (i==n-1)
            break;
        _swap(&c[i], &c[i+1]);
        for (j=0; j<i && c[j]==1; j++) NULL;
        for (k=j,j++; j<i; j++)
            if (c[j] == 1)
                _swap(&c[k++], &c[j]);
    }
    free(c);   
}

main()
{
    int a[]={2,5,6,3,18,7,11,19};
    int n=sizeof(a)/sizeof(int);
    int i;
    for (i=0; i<n; i++)
        printf("%d ", a[i]);
    printf("\nN = %d\n", n);
        
    for (i=0; i<n; i++)
        _combine(a, n, i+1, n);
}
2016-12-23 10:41
吹水佬
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:451
帖 子:10607
专家分:43186
注 册:2014-5-20
收藏
得分:0 
不用递归,也不用多层循环嵌套,应该算是高效吧。
收到的鲜花
  • 九转星河2016-12-23 10:54 送鲜花  10朵   附言:好文章
2016-12-23 10:48
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
回复 6楼 吹水佬
这个很不错要学习一下~~~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2016-12-23 10:53
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
回复 5楼 吹水佬
c[i] = 1;c是char型,这样写没有影响么~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2016-12-23 11:16
oldbb
Rank: 1
等 级:新手上路
帖 子:3
专家分:4
注 册:2008-1-26
收藏
得分:0 
以下是引用九转星河在2016-12-23 11:16:53的发言:

c = 1;c是char型,这样写没有影响么~

可以,char 可以 0--255,c[]在这只用了0或1,那个交换数据的函数也可以不要,直接将两个数取反(0变1和1变0)。
2016-12-23 14:11
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
回复 9楼 oldbb
嗯嗯,小意思,a=-a不是更直接么~直接在1和-1之间取~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2016-12-23 14:34
快速回复:关于n的倍数,有没有高效的方法?
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.025577 second(s), 10 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved