Je travaille sur un programme en C dans le cadre de Devoirs dans lequel je dois obtenir le produit de deux longs nombres qui sont pris comme chaîne de caractères. par exemple: 123456789021 et 132456789098. Comme il est pris comme une chaîne, je les ai convertis en long long int pour la multiplication. Mais le produit résultant sera très grand (plus grand que long long je suppose). Quelqu'un peut-il me suggérer une méthode pour effectuer cette multiplication?Multiplier deux longs longs C
Répondre
Voici une approche: Pensez à comment vous pourriez multiplier ces nombres à la main, sur papier. Mettre en œuvre cette méthode en C. Vous devrez découvrir:
- comment briser un entier (représenté sous forme de chaîne) en chiffres
- comment convertir chaque chiffre de retour à un nombre entier
0 <= d < 10
- comment gérer des tableaux de chiffres (ie. la taille si vous faites les tableaux?)
- comment écrire la boucle (s) que vous pourriez avoir besoin de mettre en œuvre la multiplication
- comment gérer les produits portant d'un chiffre à l'autre
- comment convertir ces chiffres en caractères pour la sortie
généralement de grands entiers représentés sous forme de tableaux d'octets. Vous pouvez regarder l'implémentation BigInteger de Microsoft dans DLR. Je pense qu'ils ont utilisé des algorithmes développés par Knuth
Une autre approche serait de multiplier les nombres comme float/double et stipuler la décimale lors de l'affichage des résultats.
Vous pourriez potentiellement perdre beaucoup de précision en faisant cela. –
Cela ne donnera pas une réponse exacte s'il y a trop de chiffres cependant. Cela peut être suffisant selon le cas d'utilisation, mais je ne pense pas que ce soit le but de la mission. –
Cochez cette case BigInteger library et very basic sample code de World of Seven.
Si vous êtes intéressé par certains de mes codes cuisinés maison en C (seulement la multiplication):
////////////////////////////////////////////////////////////////////////////////
Code removed after I checked the home-work tag ;)
///////////////////////////////////////////////////////////////////////////////////////
Cela fonctionne dans certains des concours de programmation précédentes j'avais participé;) Mais si vous recherchez même algorithme de multiplication plus rapide, vous pouvez mettre en œuvre Karatsuba algorithm, j'utilise personnellement ce maintenant en concours en temps réel.
(Le premier était un lien vers _BigInteger class_ de _Mahbub Murshed Suman_ (Version 6.7.28, 30 juillet 2004), le second _was_ de _World of Seven - Programmation compétitive_, même si l'URL indique "steven".) – greybeard
Hey man, vérifier cela, je viens de terminer ce jour yester comme une partie de mes devoirs:
#include<stdio.h>
#include<string.h>
int main()
{
char one[195];
char two[195];
char temp[195];
int a[195],c[195],b[195];
int x,i,j,k,l,p,add;
for(;;)/*determining the larger number...*/
{
printf("Input A:");
gets(one);
printf("Input B:");
gets(two);
k=strlen(one);
l=strlen(two);
if(l>k)
{
strcpy(temp,one);
strcpy(one,two);
strcpy(two,temp);
break;
}
else
{
break;
}
}
k=strlen(one);
l=strlen(two);
for(p=0;p<195;p++)/*assigning all initial values to 0*/
{
a[p]=0;
b[p]=0;
c[p]=0;
}
for(i=0;one[i];i++)/*converting char to integer(note:1,as a character assigned as 49.)*/
{
a[i]=((one[--k])-48);
}
for(i=0;i<two[i];i++)
{
b[i]=((two[--l])-48);
}
for(i=0;i<=strlen(two);i++)/*main algorithm*/
{
add=0;
p=0;
for(j=i;j<=(2*strlen(one)-1);j++)
{
x=c[j]+b[i]*a[p]+add;
c[j]=x%10;
add=x/10;
p++;
}
}
printf("\nMultiplication:");
for(p=(2*strlen(one)-1);p>=0;p--)
{
if(p>strlen(one)&&c[p]==0)
{
continue;
}
printf("%d",c[p]);
}
printf("\n");
}
- 1. Modulo avec longs entiers longs dans Objective C
- 2. GCC prend-il en charge les longs longs int?
- 3. ListBox éléments longs conseils
- 4. Lecture de longs fichiers ASCII dans C
- 5. Scripts longs et documents ouverts
- 6. heightForRowAtIndexPath pour NSStrings plus longs
- 7. Listes d'initialisation de constructeurs longs
- 8. SQLite longs à larges formats?
- 9. Séparer les chiffres longs par 3 chiffres
- 10. Convertir des chemins courts (8.3) en longs?
- 11. Android - réception de longs SMS (multipart)
- 12. Comment afficher les nombres longs dans Excel?
- 13. Comment inclure des littéraux extrêmement longs dans une source C++?
- 14. Traiter les processus longs dans ASP.NET
- 15. Comment bien multiplier deux longues longueurs?
- 16. C# appelle l'API Win32 pour les chemins de fichier longs?
- 17. Les spécificateurs de format alternatif sont longs C
- 18. C# Suppression d'un dossier ayant de longs chemins
- 19. Regex pour analyser des mots longs
- 20. Problème wiwebview wrap avec des mots longs
- 21. VBScript et nombres plus grands que longs
- 22. sélectionner les 10 plus longs messages
- 23. Envelopper des mots longs dans une Shoutbox
- 24. Convertir en valide lat/codes longs
- 25. spring.net temps de chargement longs et alternatives
- 26. Raccourcir ce code qui détermine la distance entre deux lat/longs en C#?
- 27. SIG trouver des points (longs lats) qui sont contenues par un polygone exprimé comme une collection de longs lats
- 28. Déclaration sténographique des types de collection génériques longs
- 29. Comment générer des mots longs de 2 caractères efficacement?
- 30. Multiplier deux champs
Et s'il n'y avait pas le fait que votre entrée et de sortie sont en base 10, vous pourrait faire tout cela plus efficacement en utilisant la base 2^32 (chiffres maintenus dans un type 64 bits) ou base 2^16 (dans un type 32 bits) au lieu de base 10. –