【问题标题】:I have a problem regarding array in C (Hackerearth - Find Product)我对 C 中的数组有疑问(Hackerearth - Find Product)
【发布时间】:2019-09-08 04:42:46
【问题描述】:

你得到了一个由正整数组成的大小为 N 的数组 A。您需要找到并打印此数组 Modulo 中所有数字的乘积。

问题链接 - https://www.hackerearth.com/practice/basic-programming/input-output/basics-of-input-output/practice-problems/algorithm/find-product/description/

示例输入

5
1 2 3 4 5

样本输出

120

我尝试过使用:

int main()
{
    long num,p=1;
    scanf("%d", &num); 
    long arr[num];

    for(long i=0;i<num;i++)
    { 
        scanf("%d",&arr[i]);
        p=p*arr[i];
    }
    printf("%d",p);
}

输入测试用例 1:

1000





290 112 217 950 559 866 239 367 549 141 323 967 927 267 917 681 348 478 868 
325 332 391 445 738 809 573 792 662 942 877 727 131 86 723 397 657 507 511 
369 921 459 960 870 657 399 973 856 586 674 679 104 133 836 851 716 534 245 
29 613 880 119 737 640 62 888 967 969 361 51 937 3 813 912 480 624 694 900 
926 255 726 499 435 514 297 752 805 340 230 543 735 517 954 913 104 972 958 
843 695 50 379 540 500 171 370 658 737 376 540 639 233 215 920 925 659 243 
158 920 741 362 191 606 8 945 142 360 138 695 648 103 20 514 148 999 1 591 
136 454 100 561 272 697 452 426 841 538 298 71 614 941 553 352 278 120 769 
721 948 286 4 450 801 212 463 854 586 881 227 276 130 412 987 962 82 248 195 
835 398 350 766 59 16 868 108 50 649 633 436 939 829 186 763 675 804 728 194 
276 615 332 985 464 472 350 72 631 616 771 115 644 389 929 886 946 571 860 
214 114 741 443 318 6 696 917 725 741 725 838 600 645 540 800 240 55 110 600 
208 388 53 612 464 996 474 854 828 618 915 590 755 751 832 964 877 191 448 
89 57 224 837 970 918 81 595 869 398 353 869 617 934 991 742 773 65 506 274 
243 476 710 975 723 486 746 130 135 139 714 2 119 229 929 953 531 295 284 
876 577 269 849 175 798 516 178 230 924 610 154 599 635 639 253 928 68 336 
674 993 791 535 621 788 250 61 643 448 734 855 751 368 36 244 516 758 564  
768 853 698 30 899 530 634 186 996 261 364 437 341 143 175 906 638 341 187 
123 101 824 209 870 668 457 860 334 271 947 246 81 368 662 507 562 469 430 
977 779 974 375 693 249 37 250 345 29 987 114 34 378 886 561 538 497 959 863 
820 426 141 201 205 618 89 216 191 827 853 668 139 947 762 437 878 65 145 
390 175 525 395 164 177 784 406 455 739 657 658 927 807 89 394 276 48 587 58 
15 371 807 276 878 716 555 723 8 117 300 707 384 740 998 940 814 38 461 188 
247 650 606 227 256 192 623 799 729 117 394 323 380 179 260 410 380 58 316 
95 443 585 893 736 961 957 71 607 304 797 535 410 537 503 498 465 690 686 
830 843 301 365 92 599 74 849 149 336 938 789 778 210 484 807 672 764 966 
651 473 459 885 556 56 815 983 187 234 761 669 534 928 662 41 301 761 818 
596 308 558 985 429 800 810 712 952 270 675 752 373 863 962 489 560 764 673 
203 674 322 774 830 925 156 955 169 851 614 611 511 38 232 99 430 772 767 
193 372 865 122 830 417 21 87 140 5 857 30 646 407 500 965 914 149 553 923 
567 916 400 817 359 203 43 749 308 111 27 612 410 585 911 641 910 254 535 66 
522 19 463 860 766 173 662 593 984 309 775 76 97 732 98 97 550 76 723 498 30 
48 542 459 273 596 136 107 47 28 849 157 928 191 669 91 203 859 864 655 665 
767 276 116 142 279 927 863 693 911 709 842 305 380 756 965 728 716 182 286 
269 645 392 681 813 292 250 177 817 728 288 874 309 185 71 209 842 612 834 
25 565 828 794 484 568 762 572 652 600 875 781 410 844 197 704 145 245 751 
469 650 301 772 915 835 363 513 340 384 295 703 486 78 847 577 347 971 645 
39 17 834 341 77 785 91 976 21 819 317 286 253 460 107 364 261 948 57 670 
529 277 96 237 737 66 529 866 570 328 377 346 863 174 556 793 245 997 205 43 
360 111 546 692 652 617 454 242 337 31 832 887 494 83 526 694 848 226 818 
502 186 645 273 560 44 716 348 339 911 868 726 37 249 383 212 125 562 43 62 
811 955 290 538 929 791 716 948 587 14 79 717 715 170 866 789 358 786 446 
339 488 197 787 417 836 590 6 198 813 497 98 392 926 980 344 325 717 369 985 
179 151 960 706 707 217 236 74 781 825 245 224 584 337 991 827 868 326 695 
984 642 664 756 147 374 609 839 379 315 781 713 653 474 727 61 289 474 636 
835 613 202 948 631 810 577 936 363 562 44 919 779 290 869 360 707 609 479 
18 368 276 302 88 459 686 922 43 275 252 962 346 115 99 866 560 829 131 479 
31 376 477 995 962 895 610 670 581 78 93 881 636 490 746 265 379 853 569 170 
627 429 395 440 631 993 11 142 602 944 817 471 281 869 565 251 439 90 95 280 
363 856 240 774 665 954 284 813 730 982 560 951 630 725 704 700 398 239 844 
770 512 410 61 316 211 429 429 613 930 447 474 171 319 19 359 345 978 642 
948 177 202 534 18 160 648 698 369 925

输出:

115327841

这是我的 C 代码:

#include <stdio.h>

int main()
{
    long num,p=1;
    scanf("%d", &num); 
    long arr[1000];

    for(long i=0;i<num;i++)
    {   
        scanf("%d",&arr[i]);
        p=p*arr[i];
    }

    printf("%d",p);
}

【问题讨论】:

  • 问题是什么?您的代码似乎正在运行。
  • 取模什么? + 你认为你可以在C 中找到这么大的产品而不需要做大量的安排来控制它吗?
  • @HenriMenke 此代码将无法处理 1000 个数字的乘积(至少在 C 中)。
  • @HenriMenke:它只在产品小于 1000000007 时才有效。
  • 我的代码一直工作到产品小于 1000000007,所以我必须使用 long long int 概念而不仅仅是 int。更改后,代码也适用于大值(> 10 ^ 9)。

标签: c arrays algorithm


【解决方案1】:

您未能正确复制problem statement:

给你一个数组A,大小为N,由正整数组成。您需要找到并打印此数组中所有数字的乘积,模 109+7。

以下是简单迭代解决方案的步骤(如练习页面中所述):

  • 读取迭代次数
  • 从产品的当前值1 开始
  • 重复以下步骤:
    • 读取下一个数字
    • 乘以这个数字
    • 以1000000007为模减少乘积
  • 打印产品。

为使上述步骤产生正确的结果,您必须使用可以处理大至 (109+7-1)2 的值的类型,即略高于 1018 和低于 260。 64 位整数足以处理这些值,但 32 位整数则不然。 long long 类型由 C 标准强制要求至少有 63 个值位,因此适用于计算。

像在程序中那样计算所有值的乘积是不正确的,因为您几乎会立即得到一个整数溢出,它具有未定义的行为,最多会导致隐式模 232 运算,它给出与所需的模 1000000007 运算不同的值。

这是一个这种类型的实现:

#include <stdio.h>

int main() {
    int n;
    long long product, value;

    if (scanf("%d", &n) != 1 || n < 0) {
        printf("invalid input\n");
        return 1;
    }
    product = 1;
    while (n--) {
        if (scanf("%lld", &value) != 1) {
            printf("invalid input\n");
            return 1;
        }
        product = product * value % 1000000007;
    }
    printf("%lld\n", product);
    return 0;
}

【讨论】:

    【解决方案2】:

    用数学方法解决问题。

    这行得通-

    int main() {
        long long num, p = 1, temp;
        scanf("%lld", &num); 
    
        for(int i=0; i<num; i++)
        { 
            scanf("%lld",&temp);
            p=(p*temp) % 1000000007;
        }
        printf("%lld",p);
    }
    

    这是主要交易 - p=(p*temp) % 1000000007 如果您先计算产品,则它可能已超过 long long int 最大限制。因此,对于每次迭代,我们都确保它应该超过其限制。

    这些确保产品不应超过 long long int 最大限制。 (确保不会发生溢出)。

    我的提交链接-https://www.hackerearth.com/submission/30625840/

    【讨论】:

    • 此解决方案使用了正确的方法,但缺乏正确的解释。
    • 您的代码仍然存在问题:它缺少正确的包含文件,缺少输入验证,输出未以换行符终止,main 不返回 0,尽管在 c99 中隐含被认为是好的样式,如果您在第一步输入一个非常大的数字,它将永远运行。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-08-05
    • 1970-01-01
    • 1970-01-01
    • 2020-12-30
    • 2017-02-22
    • 2019-05-06
    • 1970-01-01
    相关资源
    最近更新 更多