c - 我对 C 中的数组有疑问(Hackerearth - 查找产品)

标签 c arrays algorithm

给定一个大小为 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);
}

最佳答案

您未能正确重现 problem statement :

You have been given an array A of size N consisting of positive integers. You need to find and print the product of all the numbers in this array modulo 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;
}

关于c - 我对 C 中的数组有疑问(Hackerearth - 查找产品),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57839243/

相关文章:

c - 为什么我们在使用单指针传递给函数时必须对二维数组进行类型转换?

c - 在反引号之间执行的程序的 termcap

python - 如何将 zip 文件从字节数组写入磁盘

java - 子集总和但偶数子集大小

algorithm - 如果某些边缘是固定的,那么用于 MST 的标准 Kruskal 类方法是否可行?

algorithm - 编写一个算法,在 a、b 和 c 中找到第二小的值

c - 在 C 中返回多维数组

c 套接字文件传输,服务器不打开现有文件

arrays - Angular 2 - ngFor while index < x

sql - 如何在 postgresql 中使用 array_agg 包含 NULL 值?